硒隐式等待不起作用

2024-05-04

这是我第一次使用 selenium 和无头浏览器,因为我想使用 ajax 技术抓取一些网页。

效果很好,但在某些情况下加载整个页面需要太多时间(特别是当某些资源不可用时),所以我必须为selenium设置一个超时。

首先我尝试过set_page_load_timeout() and set_script_timeout(),但是当我设置这些超时时,如果页面没有完全加载,我将不会获得任何页面源,如下代码:

driver = webdriver.Chrome(chrome_options=options)
driver.set_page_load_timeout(5)
driver.set_script_timeout(5)
try:
    driver.get(url)
except Exception:
    driver.execute_script('window.stop()')

print driver.page_source.encode('utf-8')  # raise TimeoutException this line.

所以我尝试使用隐式等待和条件等待,如下所示:

driver = webdriver.Firefox(firefox_options=options, executable_path=path)
print("Firefox Headless Browser Invoked")
wait = WebDriverWait(driver, timeout=10)
driver.implicitly_wait(2)
start = time.time()
driver.get(url)
end = time.time()
print 'time used: %s s' % str(end - start)
try:
    WebDriverWait(driver, 2, 0.5).until(expected.presence_of_element_located((By.TAG_NAME, 'body')))
    print driver.find_element_by_tag_name('body').text
except Exception:
    driver.execute_script('window.stop()')

这次我得到了我想要的内容。但是,它花费了很长的时间(40+秒),这意味着我设置的2秒超时根本不起作用。

在我看来,这似乎是driver.get()直到浏览器停止加载页面后调用才会结束,只有在这之后下面的代码才可以工作,并且你不能杀死它get()打电话,否则你什么也得不到。 但这与硒文档有很大不同,我真的想知道错误在哪里。

环境:OSX 10.12、selenium 3.0.9、FireFox 和 Google Chrome Headless(均为最新版本。)

- - 更新 - -

感谢您的帮助。我将代码更改如下,使用WebDriverWait()单独一个,但是仍然存在调用持续很长时间的情况,远远超过我设置的超时时间。 想知道是否可以在时间到时立即停止页面加载?

driver = webdriver.Firefox(firefox_options=options, executable_path=path)
print("Firefox Headless Browser Invoked")
start = time.time()
driver.get('url')
end = time.time()
print 'time used: %s s' % str(end - start)
try:
    WebDriverWait(driver, 2, 0.5).until(expected.presence_of_element_located((By.TAG_NAME, 'body')))
    print driver.find_element_by_tag_name('body').text
except Exception:
    driver.execute_script('window.stop()')
driver.quit()

这是测试中的终端输出:

Firefox Headless Browser Invoked
time used: 44.6049938202 s

根据代码,这意味着driver.get()call 需要 44 秒才能完成调用,这是意料之外的,我想知道我是否误解了无头浏览器的行为?


正如你在问题中提到的加载整个页面需要太多时间(特别是当某些资源不可用时)如果测试中的应用程序 (AUT) uses JavaScript or AJAX 调用.

  • In your first scenario you have induced both set_page_load_timeout(5) and set_script_timeout(5)
    • set_page_load_timeout(time_to_wait) https://seleniumhq.github.io/selenium/docs/api/py/webdriver_remote/selenium.webdriver.remote.webdriver.html#selenium.webdriver.remote.webdriver.WebDriver.set_page_load_timeout:设置抛出异常之前等待页面加载完成的时间。
    • set_script_timeout(time_to_wait) https://seleniumhq.github.io/selenium/docs/api/py/webdriver_remote/selenium.webdriver.remote.webdriver.html#selenium.webdriver.remote.webdriver.WebDriver.set_script_timeout:设置脚本在执行期间应等待的时间量execute_async_script在抛出异常之前调用。

因此测试中的应用程序依赖于JavaScript or AJAX 调用在两个条件都存在的情况下超时异常.

  • 在你的第二种情况下,你已经诱导了两者implicitly_wait(2) and WebDriverWait(driver, 2, 0.5).

    • implicitly_wait(time_to_wait) https://seleniumhq.github.io/selenium/docs/api/py/webdriver_remote/selenium.webdriver.remote.webdriver.html#selenium.webdriver.remote.webdriver.WebDriver.implicitly_wait:设置隐式等待找到元素或命令完成的超时。
    • WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None) https://seleniumhq.github.io/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.wait.html#module-selenium.webdriver.support.wait:结合不同的情况设置超时时间expected_conditions https://seleniumhq.github.io/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.expected_conditions.html#module-selenium.webdriver.support.expected_conditions
    • 但你正在经历很长的超时(40+秒)正如其中明确提到的docs https://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#explicit-and-implicit-waits 不要混合隐式和显式等待,这可能会导致不可预测的等待时间

WARNING:不要混合隐式和显式等待。这样做可能会导致不可预测的等待时间。例如,设置 10 秒的隐式等待和 15 秒的显式等待,可能会导致 20 秒后发生超时。

解决方案 :

最好的解决方案是删除所有实例implicitly_wait(time_to_wait)并替换为WebDriverWait()为了稳定的行为测试中的应用程序 (AUT).


Update

根据您的反问题,当前的代码块看起来很完美。您所看到的时间测量time used: 44.6049938202 s是所需的时间Web Page完全加载并正常运行所需的时间Client(即网页浏览器)将控制返回给网络驱动程序实例一次'文档.readyState'等于“完全的”已完成。Selenium或者作为用户,您无法控制此渲染过程。但是,为了获得更好的性能,您可以遵循以下最佳实践:

  • 保持你的JDK目前更新版本Java SE 开发套件 8u162 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
  • 保持你的硒客户端目前更新版本硒3.9.0 https://pypi.python.org/pypi/selenium
  • 保持你的网络驱动程序版本已更新。
  • 保持你的网页浏览器版本已更新。
  • 清洁你项目工作区定期在您的 IDE 中构建仅具有所需依赖项的项目。
  • Use CCleaner https://www.ccleaner.com/ccleaner工具可以消除您之前和之后的操作系统杂务测试套件执行。
  • If your 网页浏览器基础版本太旧卸载网页浏览器通过雷沃卸载程序 https://www.revouninstaller.com/revo_uninstaller_free_download.html并安装最新的 GA 发布版本网页浏览器.
  • 执行你的Test.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

硒隐式等待不起作用 的相关文章

随机推荐

  • ASP.NET 2.0 - 带有 tbody / thead 的 DataGrid

    有没有办法让 DataGrid 控件呈现 tbody 和 thead HTML 元素 虽然我喜欢 user186197 的答案 但该博客文章使用反射 但在非完全信任的托管环境中可能会出现问题 这是我们使用的 没有黑客 public clas
  • richTextBox 字符数限制?

    我在丰富的文本框中存储大量文本时遇到问题 我正在尝试读取一个相当大的文本文件 从 90mb 到 450mb 的任意位置 并将我读到的内容放入富文本框中 它可以在一个简单的程序中运行 但是当我在一个复杂的程序中运行时 我会得到一个 OutOf
  • 如何在不使用 CreateUser 的情况下在 ASP.NET 成员资格表中创建用户

    我想将用户和帖子从我正在使用的现有论坛迁移到 ASP NET 成员资格表 而不使用 CreateUser 基本上我想维护用户ID 以便当我迁移帖子时它们继续与正确的用户关联 有没有办法做到这一点 或者我最好只使用 CreateUser 然后
  • filepicker.io - 转换()和存储与 FPUrl 转换

    我有一个应用程序 用户可以在其中上传图像 并且它必须提供三种不同的尺寸 缩略图 中尺寸 全尺寸 我的用户不需要修改该图像 似乎有两个选择 选项1 每当我想显示缩略图时 就使用图像转换网址 前任 选项2 将convert 与store 结合使
  • Capistrano 和 GitHub Private Repo – 权限被拒绝(公钥)

    我继承了一个托管在 Linode 上的 Rails 项目 之前的开发人员使用 BitBucket 存储库以及 Capistrano 进行部署 我已经在 GitHub 上设置了一个私人存储库 并且正在尝试让 Capistrano 配方发挥作用
  • 由于标志字节串 -lt-0_10_4,无法使用 Stack 构建 hello world 程序

    通过生成一个裸露的 hello world 项目 stack new myproject simple 每当我跑步时stack setup stack init or stack build我总是出现以下错误 Downloading lts
  • 如何删除“绿屏”肖像背景

    我正在寻找一种方法来自动从大量图片中删除 透明 绿屏 肖像背景 到目前为止 我自己的尝试 呃 不太成功 我正在四处寻找any有关该主题的提示 解决方案或论文 商业解决方案也很好 在您评论并说不可能自动执行此操作之前 不 事实并非如此 实际上
  • PHP 扩展 mysqli 和 nd_mysqli 之间的区别[重复]

    这个问题在这里已经有答案了 Mysqli 准备好的语句 如下所示 在以下情况下会抛出以下错误 get result 叫做 stmt connection gt prepare select column from table where i
  • 是否可以在没有 LoadUserProfile = True 的情况下运行 WIF

    我正在尝试在共享主机上运行 WIF 依赖方应用程序 他们不会将 IIS 设置 LoadUserProfile 设置为 true 因此我收到以下错误 消息 数据保护操作失败 这可能是由于没有为当前线程的用户上下文加载用户配置文件而导致的 这可
  • 在 WPF 字体大小和“标准”字体大小之间转换

    我注意到在 WPF 中 12 磅的默认字体大小大致相当于 普通 应用程序 例如写字板 中的 9 磅 WPF 中的 10 磅大约是 7 磅标准 当我尝试匹配默认字体大小时在WPF写字板中的10 pt中 我发现13是最接近的 首先 为什么WPF
  • 如何在 PrimeNG 的 FileUpload 组件中中止文件上传?

    一 总结 基于PrimeNG中选择的文件文件上传组件 https www primefaces org primeng fileupload 我想中止特定文件名模式的文件上传到后端服务器 角度 6 0 7 PrimeNG 6 0 2 2 第
  • 将四边形(四边形)拟合到斑点

    应用不同的过滤和分割技术后 我最终得到如下图像 我可以访问一些轮廓检测函数 这些函数返回该对象边缘上的点列表 或者返回一个拟合的多边形 尽管有很多边 远多于 4 个 我想要一种将四边形适合该形状的方法 因为我知道它是应该是四边形的鞋盒的正面
  • PNG:deflate 和 zlib

    我试图理解 PNG 的压缩 但我似乎 网上查了很多自相矛盾的资料 我想了解 LZ77部分 带链表的哈希表中的搜索是如何完成的 这是在 deflate 中定义的吗 或者在zlib中实现 可以选择搜索方法吗 PNG 编码器 解码器可以设置一些压
  • Firebase 模拟器返回空数据,但部署后工作正常

    我编写了一个非常基本的 API 它将返回服务 我尝试在模拟器中运行此 API 但它返回空数据 status success statusCode 200 message Services retrieved data 我已经设置了 fire
  • Snakemake - 无法从输出文件中确定输入文件中的通配符

    我对snakemake很陌生 而且对python也不太熟悉 所以抱歉 这可能是一个非常基本的愚蠢问题 我目前正在构建一个管道来分析一组 bamfilesatlas https bitbucket org phaentu atlas wiki
  • 使用 VSCode 时无法单步执行“仅我的代码”?

    调试时 VSCode 中是否有像 Visual Studio 中的 Just my Code 选项一样的选项 我想单步执行我自己的代码 而不是像 next tick js 这样的所有内部节点代码 我尝试过添加 skipFiles node
  • 当我尝试导入添加到 WEB-INF/lib 的 jars 时,它们无法被识别:说该包不存在

    我已经添加了org apache commons fileupload and org apache commons io封装成WEB INF lib我的项目基于 google appengine 的目录 但是当我尝试导入 servlet
  • Matplotlib 行高表属性

    我已经尝试了我能找到的所有命令和文档 如何在这里设置行的高度 from pylab import Create a figure fig1 figure 1 ax1 1 fig1 add subplot 111 Add a table wi
  • Solr MoreLikeThis 不适用于多个分片?

    我在 SolrCloud 中有 5 个节点集群 每个节点有 2 个分片 Solr版本 6 3 0 现在 当我运行 mlt 查询时 它仅返回每个节点的结果 并且不会将它们分布在所有分片 节点上 即 没有给出任何结果 给出结果 我什至尝试将其指
  • 硒隐式等待不起作用

    这是我第一次使用 selenium 和无头浏览器 因为我想使用 ajax 技术抓取一些网页 效果很好 但在某些情况下加载整个页面需要太多时间 特别是当某些资源不可用时 所以我必须为selenium设置一个超时 首先我尝试过set page