Selenium: 不要等待异步资源

6

Selenium在进入新页面之前等待异步资源调用。

例如:

<script src="https://apis.google.com/js/platform.js" async defer></script>

在一个有许多外部API(例如Google Analytics和来自G+、Facebook和Twitter的共享按钮)的网站上,Selenium花费的时间等待异步调用比运行测试所用的时间还要长。是否有办法禁用这种行为,使得Selenium不必等待异步外部API调用呢?
2个回答

5
你所看到的是页面加载超时的实现。你可以进行调整并处理超时异常:
try:
    driver.set_page_load_timeout(5)  # in seconds
except TimeoutException:
    pass

# continue with testing

除此之外,您还可以添加显式等待来等待某个期望的“操作”元素出现,以便在元素出现后立即进行测试。
您还可以通过阻止与您的测试无关且不会影响页面渲染或测试结果的特定域的请求来优化它。例如,如果您想要阻止 Google Analytics 请求:

您也可以禁用图像、CSS或Flash(如果适用):


当页面加载时间过长时,这会抛出一个错误。我希望Selenium能够继续执行代码和加载页面,即使异步资源没有加载完成。 - JustinLovinger
@PaintingInAir 好的,你看到了什么错误?能否提供一个可重现的例子?谢谢。 - alecxe
设置较低的页面加载超时时间会导致超时异常。根据Selenium文档,这就是driver.set_page_load_timeout的目的。你回答的第二部分是正确的方向。由于我加载的所有异步资源都是外部的,因此它可以达到相同的效果,而不需要明确解决等待异步调用的问题。 - JustinLovinger
@PaintingInAir 做得不错,但为什么不处理和忽略超时异常并继续测试呢?谢谢! - alecxe
我觉得你误解了。除非我减少页面加载超时时间,否则我不会遇到超时错误。我以为你是建议减少页面加载超时时间以停止等待异步资源。这纯粹是性能问题。 - JustinLovinger
1
@PaintingInAir 处理这个问题的“正确”方法确实是阻止外部资源调用。那就是答案的(或应该是)重点。如何完成这个过程的机制可能会很复杂,但我可能会依赖代理。偷懒的方法是设置页面加载超时,然后捕获并忽略异常,然后超时就会被触发。答案中缺少的一点是,如果您选择超时路线,那么您必须捕获并忽略异常。 - JimEvans

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接