У меня есть 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! Однако, прежде чем я смог удалить этот вопрос, ответ уже был опубликован. Я оставляю резолюцию вместо публикации отдельного ответа.