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

18

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

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's 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 будет ждать загрузки всей страницы, прежде чем начнет искать этот элемент. В некоторых крайних случаях это займет даже ЧАСЫ. Что я могу с этим поделать?

Ваш Ответ

2   ответа
12

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

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

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

Круто! Конечно, хорошая возможность иметь. Ashwin Prabhu
@ JimEvans: Спасибо, приятель, я только что нашел патч для Python для этого Code.google.com / р / селен / вопросы / ..., и это прекрасно работает. Shane
@ JimEvans: Эй, приятель, пожалуйста, проверь мое обновление. Меня беспокоит новая проблема. Shane
@ JimEvans: вы представилиpageLoadTimeout() в IE? Почему никто не поместил это в список изменений? Черт, да, я ждала этого целую вечность Petr Janeček
До 2.22 не было журнала изменений, специфичного для драйвера IE, поскольку не было отдельного механизма для распределения битов IE. В настоящее время каждое изменение документируется, но, поскольку 2.22.0 являлось базовой линией, оно не включало каждое изменение из всей истории проекта в качестве первой записи. JimEvans
0

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

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

Похожие вопросы