Selenium, Firefox Geckodriver не ожидает полной загрузки страницы, когда интернет работает медленно - PullRequest
0 голосов
/ 26 октября 2018

Я использую селен с драйвером Firefox (geckodriver), чтобы получить какой-либо источник страницы из списка URL-адресов.

Я заметил, что если интернет работает медленно, FireFox не ждет, пока страница полностью загрузится (выполнение не ожидает в строке 5). В результате источник page_source в строке 9 фактически взят из предыдущего URL.

Как я могу заставить Firefox ждать полной загрузки страницы?

Селен: 3.14.1
Geckodriver: 0.23.0 linux64

1        browser = webdriver.Firefox()
2    
3        for url in url_list:
4          
5            browser.get(url)
6    
7            sleep(1)
8    
9            page_source = browser.page_source
10    
11           if  html == page_source:
12    
13                print "error: page not fully loaded"
14    
15                exit(1)
16           html = page_source

Обновление: я протестировал с драйвером Chrome. Драйвер Chrome ожидает полной загрузки страницы. Так что, возможно, проблема в драйвере FireFox.

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Обычно ".get" в веб-драйвере Selenium выполняется с помощью операции HTTP GET, и метод блокируется до завершения загрузки.Итак, я не думаю, что медленное интернет-соединение вызывает проблему, но есть вероятность, что проблема возникнет, если вы прервали интернет-соединение.

Если страница такая же, вы можете использовать Explicit Wait для ожидания любого элемента на странице, а если элемент не виден или не загружен, вы можете снова нажать метод ".get" или вы можете сделать".refresh ()" метод, как вам нужно.

Очевидно, что если страницы отличаются, то дождитесь загрузки тега body [xpath: "// body"] с использованием явного ожидания.

Подробнее о явном ожидании см. Здесь

0 голосов
/ 26 октября 2018

Вы должны проверить, что готовое состояние завершено для загруженной страницы в браузере или нет, пока вы не можете установить ожидание использования драйвера, t выдаст ошибку, поэтому вы должны поместить это в блок try catch.

driver.get(url)
WebDriverWait(driver, 30).until(readystate_complete)

есть разные состояния готовности, например
загрузка, полная и интерактивная
обычно в javascript люди делают document.readystate
и завершение означает, что документ полностью прочитан и все ресурсы (например, изображения) также загружены

0 голосов
/ 26 октября 2018

Вы можете подождать с помощью WebDriverWait, пока не будет найден конкретный элемент или, если сеть замедлена, а также добавить неявное ожидание, а затем получить источник страницы

Ниже приведен код Java:

WebDriverWait wait = new WebDriverWait(driver, 20);

wait.until(ExpectedConditions.stalenessOf(element));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...