【问题标题】:Refreshing DOM so Selenium Web Driver can find element刷新 DOM 使 Selenium Webdriver 找不到元素
【发布时间】:2018-10-21 00:45:55
【问题描述】:

我正在尝试使用 Selenium 的 Chrome 网络驱动程序导航到页面,然后填写表格。问题是页面加载,然后 5 秒后显示表单。所以 JavaScript 会在 5 秒后改变 DOM。我认为这意味着 Web 驱动程序接收的源代码中不存在表单的 html id。

这是带有 Chrome 的检查功能的表单的样子:

但是该 html 并没有出现在页面的源 html 中。

用于查找元素的 Python:

answerBox = driver.find_element_by_xpath("//form[@id='answer0problem2']")

如何访问此表单中的输入字段?

有没有办法在不更改页面的情况下刷新网络驱动程序?

【问题讨论】:

    标签: python selenium dom selenium-chromedriver


    【解决方案1】:

    您遇到了这个问题,因为您没有给网站足够的时间来加载。

    像这样使用time.sleep()

    import time
    driver.get('http://your.website.com')
    time.sleep(15)
    
    plain_text = driver.page_source
    soup = BeautifulSoup(plain_text, 'lxml')
    

    这是因为 selenium 产生了它自己的进程并且不受 python sleep 的影响。在这段睡眠时间内,无头浏览器继续工作并加载网站。

    为每个 selenium 执行实现 sleep 时间以考虑页面加载是有帮助的。因为 python 进程与 selenium 通信的唯一方式是当您调用 driver 时,在页面加载之前调用可能会产生像您描述的那样的后果。

    【讨论】:

    • 谢谢,我尝试了 10 秒,但我想这还不够。 derp
    • 您可以使用更多选项网站正在积极过滤刮擦,例如通过设置DesiredCapabilities['pageLoadStrategy'] = none 将返回实时加载结果,而无需等待页面加载实际完成。有些网站根本不允许页面加载完成以防止刮擦。
    • 不好的建议。 time.sleep 不是解决方案,永远不应该使用。正确的方法是添加显式等待模式,例如wait = WebDriverWait(self.driver, 15) 并将 find_element_by_xpath 替换为 and wait.until(EC.presence_of_element_located((By.XPATH
    • @KirilS。我试过了,但是WebDriverWait 并没有停止这个过程,driver.page_source 在之后立即运行并且什么也不返回 - 如果我打算使用,python 端是否需要让它返回值 等待BeautifulSoup?
    • 你还在等什么?以及你的代码是什么样子的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 2016-09-07
    • 2017-10-24
    • 1970-01-01
    相关资源
    最近更新 更多