Почему эти два вызова локатора элементов ведут себя по-разному? - PullRequest
0 голосов
/ 30 октября 2019

Я пишу автоматизацию web-драйвера с использованием JavaScript для тестирования веб-приложения. У меня есть код, который выглядит следующим образом:

var selenium = require('selenium-webdriver');
By = selenium.By;
until = selenium.until;

driver = new selenium.Builder().
  withCapabilities(selenium.Capabilities.chrome()).
  build();

getItems = async function() {
  try {
    var itemsXpath = '[xpath expression]';
    var items = await driver.findElements(By.xpath(itemsXpath));
    console.log(items.length + ' items found');
    ...
  }
  catch(err) {
    console.log(err);
  }
}

Это успешно. Однако, если я заменю строку await на:

var items = await driver.wait(until.elementsLocated(By.xpath(itemsXpath)),60000);

, она не будет выполнена должным образом. Ни следующий console.log(), ни тот, что в блоке catch(), не отображается.

После прочтения документации у меня сложилось впечатление, что если на странице есть элементы, которые соответствуютВ локаторе XPath любая из этих функций будет работать и возвращать элементы. Однако, если бы элементов не было на странице, вторая формулировка ожидала бы их появления (в данном случае до 60000 мс).

Обратите внимание, что второй способ написания этого не работает, дажеесли элементы уже находятся на экране во время вызова getItems(). Кроме того, программа завершается за меньшее время, чем время ожидания, указанное в driver.wait().

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

1 Ответ

0 голосов
/ 30 октября 2019

Строка, которую вы написали:

var items = await driver.findElements(By.xpath(itemsXpath));

проверит элемент и вернет Array<WebElement>, если данный xpath совпадает с каким-либо элементом (элементами).

Но методы ожиданиято, что вы использовали:

var items = await driver.wait(until.elementsLocated(By.xpath(itemsXpath)),60000);

не вернет ни одного элемента. Он просто ждет, пока элемент находится в DOM.

В любом случае, вы указали 60 секунд, чтобы найти элемент с помощью метода elementLocated. Эта строка будет ожидать максимум 60 секунд, чтобы найти элемент, соответствующий вашему xpath. Если указанный xpath совпадает с каким-либо элементом менее чем за 60 секунд, он просто завершит это ожидание в это конкретное время и перейдет к следующей строке. Обратите внимание, что в таких ситуациях ошибок не будет. Следовательно, нет шансов поймать блок.

Вы можете обратиться к этой странице для получения более подробной информации об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...