Selenium, firefox geckodriver не дожидается полной загрузки страницы при медленном интернете

Я использую селен с драйвером 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.

Что такое html, как и if html == page_source:?

DebanjanB 26.10.2018 10:30

html хранит источник страницы предыдущего URL

Kelvin Tan 26.10.2018 10:43
1
2
1 917
3

Ответы 3

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

Пожалуйста, найдите ниже Java-код:

WebDriverWait wait = new WebDriverWait(driver, 20);

wait.until(ExpectedConditions.stalenessOf(element));

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

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

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

Подробнее о явном ожидании обратитесь сюда

Если соединение хорошее, метод будет заблокирован до завершения загрузки. Если связь прервана. Драйвер FireFox не блокируется. Я тестировал Chrome. Драйвер Chrome блокируется до завершения загрузки. Так что, возможно, проблема в драйвере FireFox.

Kelvin Tan 26.10.2018 10:58

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

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

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

Другие вопросы по теме