Почему Selenium не находит элемент на основе XPath с индексом массива при использовании Page Factory?

У меня есть POM (объектная модель страницы), которая имеет следующее объявление:

public class MyPOM
{
 [FindsBy(How=How.XPath, Using="(//textarea)[0]")]
 private IWebElement questionDescription;

 //This fails too in Selenium, but successful in Chrome-console:
 [FindsBy(How=How.XPath, Using="(//input[@class='cso-num'])[0]")]
 private IWebElement questionScore;

 public MyPOM(IWebDriver driver)
 { 
    PageFactory.InitElements(driver, this)
 }

}

На моей консоли Chrome запрос $x("//textarea")[0] запускается просто отлично. Однако каждый из моих селекторов XPath с такой «индексацией на основе массива» приводит к ошибке NoSuchElementException. Я не уверен, в чем проблема. Каждая проверка XPath за пределами Selenium, кажется, возвращает действительный узел HTML DOM, но не с Selenium.

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

WebDriverWait wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(5));

Однако, если бы я сделал следующее в каком-то методе, он отлично работает:

IWebElement questionDescription = GetDriver().FindElements(By.XPath(".//textarea"))[0];
questionDescription.Clear();
questionDescription.SendKeys(description);

Есть ли ограничение на использование индексации на основе массива при использовании XPath и PageFactory?

Причина использования XPath: большая часть HTML автоматически генерируется базовой структурой, к которой у разработчиков нет доступа или контроля над которой (довольно неудачно). Лучший способ получить надежные и надежные тесты — использовать XPath.

ОБНОВЛЕНИЕ/РЕШЕНИЕ: это была самая тупая попалась! XPath индексирует с 1, а не с 0! Однако, прежде чем я смог удалить этот вопрос, ответ уже был опубликован. Я оставляю резолюцию вместо публикации отдельного ответа.


person PhD    schedule 29.09.2015    source источник


Ответы (2)


Когда я впервые настроил свои тесты Selenium, у меня была аналогичная проблема. Попробуйте использовать что-то вроде:

driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

Это должно произойти после того, как вы инициализируете свой драйвер. Я пытался делать отдельные ожидания каждый раз, когда я загружал страницу, но они у меня тоже не работали. Кажется, 5 секунд достаточно для платформы, для которой я разрабатываю, но при необходимости их можно отрегулировать.

Обратите внимание, что фрагмент кода может отличаться в C#. Это произошло из программы Java.

person Michael Gibson    schedule 01.10.2015

Вы используете XPath, а индекс xpath начинается с 1, поэтому ваш xpath должен быть (//textarea)[1] вместо (//textarea)[0], если вы пытаетесь найти первый элемент.

person Bhupesh    schedule 30.09.2016