Зацикливание элементов в WebdriverIO

Я пытаюсь просмотреть список ссылок и выполнить несколько действий с каждой из них. Я могу перебирать элементы, используя элементы, но используя click внутри forEach не блокирует следующий шаг в forEach, и Selenium сходит с ума, поскольку он пытается продолжить выполнение действий с элементами больше не в DOM.

var q = require("q");
var webdriverio = require('webdriverio');
var options = {
    desiredCapabilities: {
        browserName: 'chrome'
    }
};

var clicks = [];

var runner = webdriverio.remote(options);

runner
    .init()
    .url('https://www.google.dk/search?q=burrito')
    .elements(".r").then(function(res){
        res.value.forEach(function(elem){
            console.log(elem);
            clicks.push(
                runner
                    .elementIdClick(elem.ELEMENT)
                    .pause(5000)
                    .back()
                    .pause(2000)
            );
        });

        return q.all(clicks);
    });

Как мне убедиться, что следующая итерация в forEach не будет запущена до того, как весь код будет выполнен внутри forEach?

Изменить: я должен был упомянуть, что уже пробовал https://github.com/webdriverio/webdriverio/issues/941 и https://github.com/webdriverio/webdriverio/issues/273 < / а>. Я обновил свой образец кода чем-то более конкретным.


person danielsvane    schedule 20.01.2016    source источник


Ответы (4)


var runner = webdriverjs
.remote(options)
.init()
.url("http://www.google.com")

 // fetch elements
.elements('a', function(err, res){
    // iterate through elements
    res.value.forEach(function(elem) {
        // execute specific action
        runner.elementIdClick(elem.Element, function(err, res) {
             // callback logic here
             // ...
        })
    })
})

из https://github.com/webdriverio/webdriverio/issues/273

person garajo    schedule 21.01.2016
comment
Я должен был упомянуть, что я уже пробовал решения, которые мог найти на github. Я обновил свой вопрос. Прости. - person danielsvane; 21.01.2016

Согласно этому ответу создателя WebdriverIO, правильный способ просмотра некоторых ссылок и щелкните по ним:

runner
    .init()
    .url('https://www.google.dk/search?q=burrito')
    .getText(".r").then(function(res){
        console.log(res);
        res.forEach(function(elem){
            console.log(elem);
            clicks.push(
                runner
                    .click('=' + elem)
                    .back()
            );
        });

        return q.all(clicks);
    });
person danielsvane    schedule 21.01.2016

Вероятно, вы захотите использовать пакет Async для чего-то подобного.

http://caolan.github.io/async/

async.eachSeries(hugeArray, function iteratee(item, callback) {
    if (inCache(item)) {
        callback(null, cache[item]); // if many items are cached, you'll overflow
    } else {
        doSomeIO(item, callback);
    }
}, function done() {
    //...
});
person Marek    schedule 26.08.2016

Простой способ извлечь текст из списка элементов

I am able to extract text for the list of webelements and then store it to the Array .


var strColumntext = [] ;
    var table =browser.$(".//*/table/tbody");

   table.$$(".//tr/th").map(function(element){
         console.log("Extracted text is : "+element.getText());
         strColumntext.push(element.getText());
    });
    
    console.log("Print the all texts : "+strColumntext)

Для этого вы можете посмотреть демоверсию Youtube

person MD AFSAR ALI    schedule 08.09.2019