Ожидание нескольких асинхронных операций в Nightwatch.js

Я пытаюсь протестировать несколько сайтов для заголовков разделов в правильном порядке. Конечно, в Nightwatch все асинхронно, включая получение текста из элемента. Следующий код приводит к тайм-аут никогда не вызывается.

client.url(`www.oneofmyrealestatesites.com`);
client.waitForElementPresent("body", 5000);
var _ = require("underscore");
// This is the order I expect things to be in
var expected = ["Homes For Sale", "New Homes", "Apartments & Rentals"];
client.elements("css selector", ".listings .module-title .label", function (data) {
  var listings = [];
  data.value.forEach(function (element) {
    client.elementIdText(element.ELEMENT, function (result) {
      listings.push(result.value);
    })
  })
  setTimeout(function () {
    // Some of the sites have extra sections
    var diff = _.intersection(listings, expected);
    client.assert.ok(listings == diff);
  }, 5000);
});

Казалось бы, независимо от того, сколько задержки я даю, списки всегда пусты. Если я утешу.списки журналов по мере того, как его толкают, он заполняется, так что это не проблема. client.pauseтакже всегда игнорируется.

Есть ли способ убедиться, что списки заполнены, прежде чем утверждать различие?

2 ответа

  1. Я использую asyncбиблиотеку для таких случаев https://github.com/caolan/async
    Docs: https://github.com/caolan/async/blob/v1.5.2/README.md

    var async = require("async");
    
    /*use each, eachSeries or eachLimit - check docs for differences */
    async.eachSeries(data.value, function (element, cb) {
        client.elementIdText(element.ELEMENT, function (result) {
          listings.push(result.value);
          // this job is done
          cb();
        });
    }, function() {
        // Some of the sites have extra sections
        var diff = _.intersection(listings, expected);
        client.assert.ok(listings == diff);
    });
    
  2. setTimeout можно вызвать только из .казнить или. executeAsync, потому что его фактический javascript. Функция ниже работала только до тех пор, пока я не использовал .executeAsync

    Надеюсь, это сработает для вас.

    Ура, Роди

     LoopQuestionsLogSymptom: function() {
            this.waitForElementVisible('.next-button', constants.timeout.medium, false);
            this.api.executeAsync(function() {
                let checkQuestion = function() {
                    // GET THE ELEMENTS
                    let nextButton = document.querySelectorAll('.next-button');
                    let answers = document.getElementsByClassName('flex-row');
                    let blueButton = document.querySelector('.blue-inverse-button');
                    let doneButton = document.querySelector('#doneButton');
                    let monitor = document.querySelector('.monitor');
                    //CHECK THE TYPES OF QUESTIONS AND CLICK THE RIGHT BUTTONS
                    if (!blueButton) {
                        answers[0].click();
                        nextButton[0].click()
                    } else if(blueButton){
                        blueButton.click();
                    }
                    setTimeout(() => {
                        if(!doneButton) {
                            console.log('Answering another question!');
                            checkQuestion();
                        }
                        if(doneButton){
                            doneButton.click();
                        }
                        else if(monitor) {
                            console.log("Exiting?")
                            .assert(monitor);
    
                            return this;
                        }
                    }, 2000);
                };
    
                // Initiating the check question function
                return checkQuestion();
    
            },[], function(){
                console.log('Done?')
            });
            this.waitForElementVisible('.monitor', constants.timeout.medium);
                this.assert.elementPresent('.monitor');
                this.assert.urlEquals('https://member-portal.env-dev4.vivantehealth.org/progress');
            return this;
        },