: first /: first-child не работает с Selenium 2 - PullRequest
2 голосов
/ 05 июля 2011

При переходе с Selenium 1 на Selenium 2 у меня возникает проблема.

У меня есть структурный эквивалент следующего:

<ul id="documentType">
    <li><a href="http://somelink.com">first</a></li>
    <li><a href="http://someotherlink.com">second</a></li>
    <li><a href="http://someotherlink.com">third</a></li>
</ul>

Ранее я бы в Selenium 1 использовалследующий селектор CSS, чтобы найти первую ссылку привязки:

#documentType li:first-child a

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

#documentType li a

Я пытался, но не смог заставить работать следующее:

#documentType li:first a

Для большей детализации я используюHtmlUnitDriver со следующим кодом:

driver.findElementByCssSelector("#documentType li a");

Любая помощь в получении эквивалента оригинального селектора работает, я был бы очень признателен!

Я в замешательстве:)

РЕДАКТИРОВАТЬФил Сакре (Phill Sacre) поднял хорошую мысль о том, что я напрямую использую HtmlUnitDriver, который может быть источником проблемы, поскольку это чистая реализация Java.Я делаю это специально для способности справиться с неприятной проблемой Ajax - узнать, когда Ajax запущен.Вы можете сделать это с помощью следующего кода:

protected void waitForAjaxToComplete() {
  long result = jQueryActive();
  while (result != 0) {
    result = (Long) driver.executeScript("return jQuery.active;");
  }
}

Это очевидно выгоднее, чем использование метода ожидания появления элемента, который может быть очень неточным.Я хотел бы, чтобы WebDriver предоставил метод executeScript, который бы разрешил эту проблему.

Далее я отметил, что по умолчанию HtmlUnitDriver использует реализацию на основе Java для анализа предоставленного селектора css, и я предполагаю, что это источникпроблема.Синтаксический анализатор - com.steadystate.css.parser.SACParserCSS21.SACParserCSS21, который не может должным образом учитывать квалификаторы: first и: first-child.

Что, кажется, делает это нормально, так это то, что поведение HtmlUnitDriver кажетсявернуть первый элемент по умолчанию.Это родственный метод findElementsByCssSelector, похоже, возвращает упорядоченный список.

В результате, хотя это и кажется ошибкой, я, возможно, ответил на свой вопрос, узнав, как работает HtmlUnitDriver.

Ответы [ 4 ]

0 голосов
/ 02 апреля 2014

Я могу предоставить следующие селекторы CSS

1. css=#documentType > li > a -- First Link
2. css=#documentType > li+li > a -- Second Link
3. css=#documentType > li+li+li > a -- Third Link

, вы можете попробовать

1.css=#documentType > li:nth-child(2) > a -- Second Link
2.css=#documentType > li:nth-child(3) > a -- Third Link
0 голосов
/ 06 июля 2011

Аналогично ответу Фила - HtmlUnit анализирует страницу не так, как FF.Я бы запустил процесс отладки, выполнив тот же тест с использованием драйвера FF и проверил, прошел ли он там.Если он пройдет, то следующий шаг, который я бы сделал, - это получить HTML-код из драйвера HtmlUnit (я думаю, команда будет driver.getPageHtml() или что-то подобное).Я бы сравнил этот HTML с HTML, который вы получаете, когда вы смотрите на HTML через настоящий браузер (FF, Chrome, ...).Иногда вы видите, что теги были вставлены реальным браузером (т.е. его парсером) или браузером HtmlUnit.Вы можете исправить свой селектор или использовать другой драйвер (или обратиться к разработчикам с просьбой исправить их HTML, потому что именно это обычно вызывает следующие проблемы: -)

0 голосов
/ 05 декабря 2013

У меня была такая же проблема с этим селектором (используя Spock / Geb).Это было решено в новой версии Geb, которая является 0.9.2 (которая также содержит изменения в драйвере модуля HTML).Теперь $ ('tr: first-child a') отлично работает с HTMLUnitDriver

0 голосов
/ 05 июля 2011

В каком браузере вы тестировали Selenium 1?Глядя в документацию Selenium, драйвер HtmlUnit является решением на чистом Java (то есть, очевидно, что он не работает в браузере).

Теперь я думаю, что есть некоторые различия в селекторах между браузерами, так что, если вы использовали браузер Firefox, прежде чем стоило бы использовать FirefoxDriver для запуска ваших тестов Selenium 2?

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