Подтвердить что ты не робот

Настроить реальный тайм-аут для загрузки страницы в Selenium WebDriver?

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

from selenium import webdriver

browser = webdriver.Firefox()
browser.get("http://example.com/example-page.php")
element = browser.find_element_by_id("someElement")

Я пробовал много вещей, таких как explicit waits или implicit waits, и искал их довольно долго, но пока не нашел решения или обходного пути. Кажется, что ничто не влияет на строку загрузки страницы browser.get("http://example.com/example-page.php"), и поэтому она всегда застряла там.

Кто-нибудь получил решение для этого?

Обновление 1:

Ответ JimEvans решил мою предыдущую проблему, и здесь вы можете найти патч python для этой новой функции.

Новая проблема:

browser = webdriver.Firefox()
browser.set_page_load_timeout(30)

browser.get("http://example.com/example-page.php")

element = browser.find_element_by_id("elementA")
element.click() ## assume it a link to a new page http://example.com/another-example.php

another_element = browser.find_element_by_id("another_element")

Как вы можете видеть, browser.set_page_load_timeout(30) влияет только на browser.get("http://example.com/example-page.php"), что означает, что если эта страница загружается более 30 секунд, она выкинет исключение тайм-аута, но проблема в том, что у нее нет мощности для загрузки страницы, например element.click(), хотя он не блокируется до полной загрузки новой страницы, another_element = browser.find_element_by_id("another_element") - это новая боль в заднице, потому что либо explicit waits, либо implicit waits будет ждать загрузки всей страницы, прежде чем она начнет искать эту элемент. В некоторых крайних случаях это займет даже ЧАСЫ. Что я могу сделать с этим?

4b9b3361

Ответ 1

Вы можете попробовать использовать тайм-аут загрузки страницы, представленный в библиотеке. Реализация его не является универсальной, но она была установлена ​​определенными связями .NET и Java, и теперь она реализована в Firefox и Firefox, а также в IE-драйвере в предстоящем 2.22. В Java, чтобы установить время загрузки страницы на 15 секунд, код для его установки будет выглядеть так:

driver.manage().timeouts().pageLoadTimeout(15, TimeUnit.SECONDS);

Если он не отображается в языковых привязках Python, я уверен, что сопровождающий с нетерпением примет патч, который его реализовал.

Ответ 2

Вы все еще можете ускорить выполнение script, ожидая присутствия (не ожидая видимости) ожидаемого элемента в течение 5-8 секунд, а затем отправив window.stop() JS script (чтобы остановить загрузку дополнительных элементов) не дожидаясь, пока целая страница загрузит или поймает исключение таймаута для загрузки страницы через 5-8 секунд, а затем вызовет window.stop()

Потому что, если на странице не принят ленивый метод загрузки (загрузка только видимого элемента и загрузка остатка элемента только после прокрутки), он загружает каждый элемент перед возвратом состояния window.ready, поэтому он будет медленнее, если какой-либо элемент занимает больше времени визуализации.