Надежно определять загрузку страницы или время ожидания, Selenium 2

Я пишу общий веб-скребок с использованием Selenium 2 (привязки Python версии 2.33, драйвер Firefox). Предполагается взятьпроизвольный URL, загрузите страницу и сообщите все исходящие ссылки. Поскольку URL является произвольным, я не могу делать какие-либо предположения относительно содержимого страницы, поэтому обычный совет (дождитесь появления определенного элемента) неприменим.

У меня есть код, который должен опрашиватьdocument.readyState пока не дойдетполный» или истекло время ожидания 30 с, а затем продолжите:

def readystate_complete(d):
    # AFAICT Selenium offers no better way to wait for the document to be loaded,
    # if one is in ignorance of its contents.
    return d.execute_script("return document.readyState") == "complete"

def load_page(driver, url):
    try:
        driver.get(url)
        WebDriverWait(driver, 30).until(readystate_complete)
    except WebDriverException:
        pass

    links = []
    try:
        for elt in driver.find_elements_by_xpath("//a[@href]"):
            try: links.append(elt.get_attribute("href"))
            except WebDriverException: pass
    except WebDriverException: pass
    return links

Такого рода работы, но примерно на одной странице из пяти.until звонок висит навсегда. Когда это происходит, обычно браузер фактически не завершил загрузку страницы (Throbber» все еще крутится) но могут пройти десятки минут и тайм-аут не срабатывает. Но иногда кажется, что страница полностью загружена, и сценарий по-прежнему не запускается.

Что дает? Как мне заставить тайм-аут работать надежно? Есть ли лучший способ запросить ожидание загрузки страницы (если нельзя сделать какие-либо предположения о содержимом)?

Примечание: навязчивая ловля и игнорированиеWebDriverException оказалось необходимым обеспечить, чтобы он извлекал как можно больше ссылок со страницы, независимо от того, делает ли JavaScript внутри страницы забавные вещи с DOM (например, я получал "несвежий элемент " ошибки в цикле, который извлекает атрибуты HREF).

НОТА: Существует много вариантов этого вопроса как на этом сайте, так и в других местах, но ониу всех либо есть тонкое, но критическое различие, которое делает ответы (если таковые имеются) бесполезными для меня, или я 'попробовал предложения и они нет работа.Ответьте, пожалуйстаименно так вопрос, который я задал.

Ответы на вопрос(5)

Ваш ответ на вопрос