Detectar com segurança o carregamento da página ou o tempo limite, Selênio 2

Eu estou escrevendo um web-scraper genérico usando Selenium 2 (versão 2.33 Ligações Python, driver do Firefox). É suposto ter umarbitrário URL, carregue a página e relate todos os links de saída. Como a URL é arbitrária, não posso fazer nenhuma suposição sobre o conteúdo da página, portanto, o conselho usual (esperar que um elemento específico esteja presente) é inaplicável.

Eu tenho código que é suposto a pesquisadocument.readyState até que ele atinja "complete" ou um tempo limite de 30s tenha decorrido e, em seguida, continue:

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

Este tipo de obras, mas em cerca de uma página de cinco, o.until chamada trava para sempre. Quando isso acontece, geralmente o navegador não terminou de carregar a página (o "throbber" ainda está girando), mas dezenas de minutos podem passar e o tempo limite não é acionado. Mas às vezes a página parece ter carregado completamente e o script ainda não continua.

O que da? Como faço o tempo limite funcionar de forma confiável? Existe uma maneira melhor de solicitar uma espera por página para carregar (se não for possível fazer suposições sobre o conteúdo)?

Nota: O obsessivo pegar e ignorar deWebDriverException provou ser necessário para garantir que extraia o máximo de links possível da página, se o JavaScript dentro da página está ou não fazendo coisas engraçadas com o DOM (por exemplo, usei erros de "elemento obsoleto" no loop que extrai os atributos HREF ).

NOTA: Existem muitas variações nesta questão tanto neste site como em outros lugares, mas todas elas têm uma diferença sutil, mas crítica, que torna as respostas (se houver) inúteis para mim, ou tentei as sugestões e elas não não funciona.Responda por favorexatamente a pergunta que fiz.

questionAnswers(5)

yourAnswerToTheQuestion