相关疑难解决方法(0)

可靠地检测页面加载或超时,Selenium 2

我正在使用Selenium 2(版本2.33 Python绑定,Firefox驱动程序)编写一个通用的Web抓取器.它应该采用任意 URL,加载页面,并报告所有出站链接.因为URL是任意的,我不能做任何假设任何有关页面的内容,所以通常的建议(等待一个特定的元素存在)不适用.

我有代码,它应该轮询document.readyState直到它达到"完成"或30s超时已经过去,然后继续:

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
Run Code Online (Sandbox Code Playgroud)

这种类型的工作,但在五分之一的大约一页,.until呼叫永远挂起.当发生这种情况,通常是浏览器事实上并没有完成加载页面(以下简称"活动指示器"仍是纺),但几十分钟可以去和超时不会触发.但有时页面似乎已完全加载,脚本仍然没有继续.

是什么赋予了?如何使超时可靠地工作?有没有更好的方式来请求等待换页到负载(如果不能对内容做任何假设)?

注意:强迫捕获和忽略WebDriverException已被证明是必要的,以确保它从页面中提取尽可能多的链接,无论页面内的JavaScript是否与DOM做有趣的事情(例如,我曾经得到"陈旧元素" "提取HREF属性的循环中的错误".

注意:这个问题在这个网站和其他地方有很多变化,但是他们都有一个微妙但关键的区别,使得答案(如果有的话)对我没用,或者我已经尝试了这些建议和他们不工作. 准确回答我提出的问题.

python webdriver selenium-webdriver

8
推荐指数
3
解决办法
2万
查看次数

标签 统计

python ×1

selenium-webdriver ×1

webdriver ×1