Подтвердить что ты не робот

Правильный способ получить количество совпадающих элементов в Nightwatch?

Я пытаюсь проверить, имеет ли приложение todo правильное количество элементов.

Документы, похоже, касаются почти исключительно отдельных элементов, поэтому мне пришлось использовать функции Selenium Protocol. Будет ли это правильным способом проверить количество совпадающих селекторов (в этом случае проверка на 2 элемента li)?

client.elements('css selector','#todo-list li', function (result) {
    client.assert.equal(result.value.length, 2);
});

Это работает в моем тесте, но я не был уверен, были ли обнаружены ошибки при использовании обратного вызова для этого. Также не уверен, почему Nightwatch не имеет вспомогательных функций, относящихся к нескольким элементам.

4b9b3361

Ответ 1

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

    browser.elements("xpath","//ul[@name='timesList']/h6", function(result){
        els = result.value;
        var i = 0;
        els.forEach(function(el, j, elz){
            browser.elementIdText(el.ELEMENT, function(text) {
                dates[i] = text.value;
                i++;
            });
        });
    });

Ответ 2

В качестве альтернативы, если вы хотите быть уверенным в том, что n количество элементов существует, вы можете использовать комбинацию :nth-of-type/:nth-child селекторов и ночного видения expect.

Например, если вы хотите проверить, имеет ли #foo девять прямых дочерних элементов:

function(browser) {
  browser
    .url('http://example.com')
    .expect.element('#foo > *:nth-child(9)').to.be.present;
  browser.end();
}

Или, если #bar имеет три прямых дочерних элемента article:

function(browser) {
  browser
    .url('http://example.com')
    .expect.element('#bar > article:nth-of-type(3)').to.be.present;
  browser.end();
}

Ответ 3

Я нашел следующее очень элегантное решение в шаблоне VueJS. Он показывает, как добавить пользовательское утверждение в Nightwatch, которое подсчитывает количество элементов, возвращаемых селектором. См. http://nightwatchjs.org/guide#writing-custom-assertions для подробностей о том, как писать пользовательские утверждения в программе Nightwatch.

После установки использование выполняется так же, как:

browser.assert.elementCount('#todo-list li', 2)

Плагин:

// A custom Nightwatch assertion.
// the name of the method is the filename.
// can be used in tests like this:
//
//   browser.assert.elementCount(selector, count)
//
// for how to write custom assertions see
// http://nightwatchjs.org/guide#writing-custom-assertions
exports.assertion = function (selector, count) {
  this.message = 'Testing if element <' + selector + '> has count: ' + count;
  this.expected = count;
  this.pass = function (val) {
    return val === this.expected;
  }
  this.value = function (res) {
    return res.value;
  }
  this.command = function (cb) {
    var self = this;
    return this.api.execute(function (selector) {
      return document.querySelectorAll(selector).length;
    }, [selector], function (res) {
      cb.call(self, res);
    });
  }
}

Этот код был добавлен в vuejs-templates по yyx990803 в 2016 году. Так что полный кредит будет yyx990803.

Ответ 4

Я адаптировал ответ Криса К. для поддержки выражений XPath с помощью встроенного метода this.api.elements:

exports.assertion = function elementCount(selector, count) {
  this.message = 'Testing if element <' + selector + '> has count: ' + count

  this.expected = count

  this.pass = function pass(val) {
    return val === this.expected
  }

  this.value = function value(res) {
    return res.value.length
  }

  this.command = function command(callback) {
    return this.api.elements(this.client.locateStrategy, selector, callback)
  }
}

Инструкции по использованию и кредиты см. его ответ