硒隐式等待不起作用

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(使用前将#替换为@)

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

  • 如何检查当前日期并移至下一个日期

    我遇到了一个我似乎无法理解的 python 问题 不确定是否需要使用 if 语句 但因为我是 python 新手 所以我实际上不确定如何编写这个小问题 事实上 这就是我遇到的问题 对于出发日历 我希望 python 能够执行以下操作 查看
  • 将 Selenium 与 PyCharm CE 结合使用

    我正在尝试将 Selenium 与 PyCharm CE 一起使用 我已经使用 pip install Selenium 安装了 Selenium 并且可以通过终端使用它 但是当我尝试将它与 PyCharm 一起使用时 出现导入错误 Imp
  • Chrome 浏览器无法在 selenium webdriver 中打开

    我的代码没有启动浏览器 项目显示运行了很长时间 但没有任何反应 我按下打印并观察到WebDriver driver new ChromeDriver 没有被处决 package seleniumautomation import org o
  • 如何将 chromedriver 与 selenium webdriver 代理一起使用?

    我们的网络环境使用代理服务器连接到外部互联网 在IE gt Internet选项 gt 连接 gt LAN设置中配置 例如 10 212 20 11 8080 现在 我在 chrome 和 IE 上使用 selenium webdriver
  • 如何使用 Selenium webdriver 测试对 SVG 对象的点击?

    我正在尝试编写代码来检查单击 SVG 对象的功能 例如此 URL 上的美国州 http www amcharts com svg maps map usa 这可行 但是有更好的方法吗 不需要物理移动鼠标的东西 robert new Robo
  • Selenium Webdriver - 单击多个下拉菜单时出现陈旧元素异常,而 HTML DOM 不会更改

    我尝试自动化一个场景 其中条件是我必须从下拉列表中选择一个选项 然后它旁边有另一个下拉列表 我必须单击下一个下拉列表中的一个选项才能启用按钮 我尝试使用代码 但它仅单击第一个选项 并显示错误为过时的元素引用 元素未附加到页面文档 请帮忙 如
  • 45000 ms 内无法绑定锁定端口 70 54

    当我尝试使用 MVN 测试命令行运行我的 selenium 测试时 出现此错误 奇怪的是 我三天前尝试了一下 运行成功了 T E S T S Running GoogleNavigationTest Tests run 1 Failures
  • C# 如何单击 IList 中的 IWebelement?

    所以我尝试单击 YouTube 上的按钮 但我无法通过 Xpath 找到该按钮 因为按钮太多 所以我尝试将它们保存在 IList 中 现在我想单击列表中的特定按钮 ChromeDriver chrome new ChromeDriver L
  • Selenium 单击在 Internet Explorer 11 上不起作用

    我尝试在 Internet Explorer 上单击 selenium 但它不起作用 我努力了element click moveToElement element click build perform javascript没事了 事实上
  • 在 selenium webdriver 中打开一个新窗口而不是新选项卡

    当在我的应用程序中手动单击链接时 它会在 Chrome 和 IE 中的新选项卡中打开 但是 当我的脚本运行时 该链接会在 IE 中的新窗口而不是新选项卡中打开 相同的脚本在 Chrome 中按预期运行 知道如何摆脱这个吗 更改 IE 的默认
  • 设置已运行的 selenium webdriver 的功能

    在硒测试步骤 如单击按钮 中 我想防止硒等待页面完成加载 我无法抛出加载异常 因为那样我就无法再使用该页面了 可以做类似的事情 如下所示 DesiredCapabilities dr DesiredCapabilities chrome d
  • 如何使用 Python Selenium 选择具有相同类名但不同条件的第一个 div

    Python Selenium 新手 我想选择第三个 div class inner TPBYkbxL 从以下3 div 具有相同类名的类 我不确定是什么意思 lt data is fake main panel true or false
  • 在不使用 Thread.sleep 的情况下单击网页后等待弹出警报

    在网页上单击搜索后 会弹出警报 我需要等到弹出窗口出现 我必须不使用 Thread sleep ExpectedConditions 类具有特定的等待警报弹出窗口的功能 WebDriverWait wait new WebDriverWai
  • Selenium IDE-自动化Select2搜索框

    我正在尝试自动化 selenium IDE 中的 select2 搜索框 我打开它并输入了我正在搜索的搜索关键字 但是 即使我有用于显示结果的代码 它也不起作用 问题是我猜字符输入得太快 因此结果不会显示在搜索框中 我确信我在某个地方出错了
  • 需要可见元素的 xpath 定位器

    我正在尝试对我的网站进行测试 在某些用户表单上遇到问题 诀窍是 表单中文本字段的数量根据用户选项的不同而变化 代码中存在禁用的文本字段 但样式为 displayed none gt 标签 所以我试图找到比逐一定位每个元素并用 try exc
  • 如何找到Selenium WebDriver的XPath? [复制]

    这个问题在这里已经有答案了 我想知道是否可以获取Web元素的XPATH test driver find elements by css selector div menu listes ul menu menu horizontal me
  • 使用 Selenium 处理验证码

    我正在尝试自动化一个表单 在表单提交过程中我会得到重新验证码 我陷入困境并弄清楚我们如何使用 selenium webdriver 处理验证码文本 虽然这个验证码正在实时进行图灵测试实施 但是我仍然在寻找某种方法来处理这种情况 所以你不能真
  • 如何使用 xpath 检查某个对象在网页中是否可见?

    我正在 R 中使用 RSelenium 包来进行网络抓取 有时加载网页后 需要检查某个对象在网页中是否可见 例如 library RSelenium open a browser RSelenium startServer remDr lt
  • C# Selenium 访问浏览器日志

    有没有一种方法可以使用 selenium 在 C 中捕获浏览器日志 我希望捕获特定页面上出现的任何 JS 错误 最好在 Chrome 或 Firefox 上使用 我之前已经在 Python 中完成了此操作 但是可以在 C 中完成此操作吗 要
  • 如何设置 Firefox 配置文件:Selenium RC、.Net 客户端驱动程序?

    我正在使用 Selenium RC Net 客户端驱动程序 我在 c selenium 目录中创建了一个 Firefox 配置文件 这是我的代码 Dim MySelenium As ISelenium Nothing MySelenium

随机推荐

  • 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