FirefoxDriver webdriver.load.strategy нестабильный findelements получает элементы с неправильной страницы

Я использую FirefoxDriver в приложении, которое быстро перемещается по нескольким похожим, но не идентичным страницам. Чтобы ускорить выполнение (мне нужно использовать FF), я установил для свойства webdriver.load.strategy значение «нестабильный». Это действительно ускоряет работу, не загружая страницы полностью, но я обнаружил очень странную ошибку.

Изучив файл со списком страниц и данными о них, я обнаружил, что некоторые страницы сопоставлены с неправильными данными. Когда я отлаживал, все работало нормально при пошаговом режиме, но как только я позволял программе запускаться хотя бы на несколько страниц, она снова начинала получать данные не с той страницы. (Чтобы уточнить, например, если я сделаю driver.get(www.google.com) , затем driver.get(www.stackoverflow.com), а затем сделаю driver.findElements(), чтобы получить заголовок страницы StackOverflow, он вернет «Google».)

При внимательном наблюдении за работой браузера мне показалось, что существует несоответствие между URL-адресами в поле URL-адреса и фактически отображаемыми страницами. URL-адреса менялись намного быстрее, чем страница. Я подозреваю, что происходит то, что драйвер не ждет полной загрузки страницы перед вызовом findElements и, следовательно, получает элементы с предыдущей страницы, которые имеют те же имена классов.

Это имеет некоторый смысл, учитывая то, что должен делать webdriver.load.strategy 'stable', но я установил ожидание для элемента на странице, и, похоже, он не ждет. Может ли это быть потому, что на каждой странице есть один и тот же элемент, поэтому этот элемент уже был виден? Я не могу ждать ничего другого, потому что все страницы имеют одинаковую настройку - отличается только отдельный текст, и я заранее не знаю, что это будет.

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

Спасибо, bsg EDIT. Я добавляю некоторый код, хотя код отлично работает, когда webdriver.load.strategy 'stable' не установлен.

for(String url : urllist)
{
  driver.get(url);
  WebElement header = (new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.tagName("h1")));
  elements = driver.findElements(By.className(elementclassname));
}

Обратите внимание, что на каждой странице есть h1 и несколько элементов с class=elementclassname.


person bsg    schedule 06.01.2014    source источник
comment
Это похоже на пример кода, так почему бы вам не опубликовать его здесь?   -  person Vlad.Bachurin    schedule 06.01.2014
comment
Чего ты ждешь? Кажется, это настоящая проблема.   -  person Nathan Merrill    schedule 06.01.2014


Ответы (1)


Я подозреваю, что происходит то, что драйвер не ждет полной загрузки страницы перед вызовом findElements и, следовательно, получает элементы с предыдущей страницы, которые имеют те же имена классов.

Я думаю, что ваша гипотеза верна.

Примерно то же самое написано в описании unstable стратегии. :

Существует бета-функция, позволяющая Firefox не ждать полной загрузки страницы после вызова .get или .click. Это может привести к сбою немедленного поиска, поэтому обязательно используйте неявное или явное ожидание.

В качестве обходного пути (не совсем красивого) вы можете сослаться driver на страницу, которая не содержит элемент в presenceOfElementLocated() (например, пустая страница).

Что-то типа:

for(String url : urllist)
{
  driver.get(url);
  WebElement header = (new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.tagName("h1")));
  elements = driver.findElements(By.className(elementclassname));
  driver.get("about:blank"); // <<<<<<<<<<
}

Итак, когда driver доберется до нового url, будет пустая страница, и нужно будет дождаться появления элемента на странице.

person Vlad.Bachurin    schedule 06.01.2014
comment
Интересное предложение. Интересно, будет ли это все же быстрее, чем ждать полной загрузки. Кроме того, у меня были целые прогоны из них - где, скажем, числа 10-30 в списке URL-адресов получают данные из числа 9. Интересно, поможет ли это в этом случае. - person bsg; 07.01.2014
comment
Я думаю, что это будет быстрее, чем полная загрузка, так как драйверу потребуется миллисекунды, чтобы добраться до локальной пустой страницы. Единственный способ узнать это попробовать. :) - person Vlad.Bachurin; 07.01.2014
comment
Да, я понял. :) Постараюсь и попытаюсь сообщить вам, если это сработает. Если это так, я приму ваш ответ тогда. Спасибо! - person bsg; 07.01.2014
comment
Кто-нибудь знает, существует ли эквивалентная функция в PhantomJS? - person Dawngerpony; 21.10.2015
comment
NB. Я поднял проблему № 400 в невыполненной работе PhantomJS в качестве запроса функции для этой возможности. . - person Dawngerpony; 21.10.2015