Как проверить, закончилась ли загрузка страницы в RSelenium
Представьте, что вы нажимаете на элемент, используя RSelenium
на странице и хотел бы получить результаты с полученной страницы. Как проверить, что итоговая страница загружена? Я могу вставить Sys.sleep()
между обработкой страницы и щелчком по элементу, но это выглядит очень уродливо и медленно.
3 ответа
Задавать ImplicitWaitTimeout
а затем найдите элемент на странице. От ?remoteDriver
setImplicitWaitTimeout(milliseconds = 10000)
Установите количество времени, которое водитель должен ждать при поиске элементов. При поиске одного элемента драйвер будет опрашивать страницу, пока элемент не будет найден или не истечет время ожидания, в зависимости от того, что произойдет раньше. При поиске нескольких элементов драйвер должен опрашивать страницу, пока не будет найден хотя бы один элемент или не истечет время ожидания, после чего он вернет пустой список. Если этот метод никогда не вызывается, драйвер по умолчанию будет неявно ждать 0 мс.
В справочном руководстве по RSelenium ( http://cran.r-project.org/web/packages/RSelenium/RSelenium.pdf) вы найдете метод setTimeout() для класса remoteDriver:
setTimeout (type = "загрузка страницы", миллисекунды = 10000)
Сконфигурируйте период времени, в течение которого конкретный тип операции может выполняться, прежде чем они будут прерваны, и |Timeout| ошибка возвращается клиенту.
type: тип операции, для которой устанавливается время ожидания. Допустимые значения: "script" для времени ожидания сценария, "неявное" для изменения неявного времени ожидания и "загрузка страницы" для установки времени ожидания загрузки страницы. По умолчанию "загрузка страницы"
миллисекунды: количество времени, в миллисекундах, которое разрешено выполнять командам с ограничением по времени. По умолчанию 10000 миллисекунд.
Похоже, это говорит о том, что remDr$setTimeout() после remDr$navigate("...") действительно будет ждать загрузки страницы или вернет ошибку тайм-аута через 10 секунд.
Вы также можете попробовать этот код, который ожидает, пока браузер предоставит информацию о том, загружена страница или нет.
objExecutor = (JavascriptExecutor) objDriver;
if (!objExecutor.executeScript("return document.readyState").toString()
.equalsIgnoreCase("complete")){
Thread.sleep(1000);
}
Вы можете просто поместить его в свою базовую страницу, чтобы вам не нужно было записывать его на каждом объекте страницы. Я никогда не пробовал это на каких-либо сайтах с поддержкой AJAX, но это может помочь вам, и ваша зависимость от сценария также исчезнет.