如何以最少的等待时间加速 Java Selenium 脚本

How to speed up Java Selenium Script,with minimum wait time

我目前正在开发一个 java selenium 项目,它通常是一个小脚本,我必须在其中检查每个元素是否存在,并基于此触发一些操作,但我们主要关心的是完成脚本的持续时间。

基本上我在我的脚本和 运行 测试中都使用了下面的每一个,虽然在每个情况下脚本都是 运行 但我发现脚本执行的速度提升很小 duration.I 正在等待

driver.manage().timeouts().implicitlyWait(10000,TimeUnit.MILLISECONDS);

并随之

!(driver.findElement(By.xpath("Element Xpath)).isEmpty()) 

driver.findElements(By.xpath("Element Xpath)).size()>0

我知道我可以选择 CSS 选择器,但在我的情况下,由于 DOM 树结构,这是不可行的。 可以用什么代替

driver.findElements(By.xpath("Element Xpath)).size()>0

这是为了检查元素是否存在,基于此我必须触发多个其他操作。

您的方法存在一些问题。

  1. .implicitlyWait() 实际上并没有等待。它设置驱动程序实例的超时时间,因此您只需设置一次,而不是每次都调用它。

  2. driver.findElement(...).isEmpty() 不会编译。也许你的意思是 .findElements()?无论哪种方式,.isEmpty().size() > 0 的速度差异都可以忽略不计。

  3. 主要问题是您在检查某些内容不存在时启用了隐式等待...尤其是 10 秒的等待。这意味着每次检查一个元素时,Selenium 将等待 10 秒,即使它期望它不存在。

您最好关闭隐式等待(将其设置为 0),然后检查是否存在您认为不存在的元素,然后再将其重新打开。那将是 10s x # 你认为不存在的存在检查。根据您进行的存在性检查的数量,这可能会花费很多时间。这样做的一个缺点是,如果您有一个带有后台进程的复杂页面,您将需要等待页面(或页面的一部分)完成加载,然后再检查是否存在带有隐式等待的元素。

旁注...Selenium 贡献者已声明不应使用隐式等待。使用 WebDriverWait 代替,但这是另一个讨论。

有几种方法可以以最佳速度执行测试套件。您的代码块会让我们更深入地了解您遇到延迟的原因。但是,对于您的代码片段,这里有一些补救措施:

  • implicitlyWait(10000,TimeUnit.MILLISECONDS);:随着越来越多的 Web 应用程序 采用 JavaScript, jQuery, AngularJS, ReactJS etc, ExplicitWait i.e. have become as a mandatory measure to synchronize the fast moving WebDriver instance i.e. the driver with the lagging Browser Client. But again as per the documentation:

Do not mix implicit and explicit waits. Doing so can cause unpredictable wait times. For example setting an implicit wait of 10 seconds and an explicit wait of 15 seconds, could cause a timeout to occur after 20 seconds.

  • 所以第一步是摆脱所有 implicitlyWaitreplace them by WebDriverWait

  • driver.findElements(By.xpath("Element Xpath)).size()>0findElement()findElements()受执行时生效的'implicit wait'次影响。 findElement(..) 调用将 return 一个匹配的行,或者重复尝试直到达到配置的超时。 findElement() 不应用于查找不存在的元素,请改用 findElements(By)assert 零长度响应。所有这些都增加了很多开销。相反,我会推荐一个带有明确 try-catch {} 块,在发生错误的情况下捕获异常并继续前进。

  • 您可以在 NoSuchElementException with isDisplayed() method within try catch block in Selenium
  • 中找到详细的讨论
  • 根据当前 WebDriver-W3C Recommendation the following is the list of preferred Locator Strategies:

  • 使用 CssSelectorXPath 时,性能 存在一些差异。一些要点:
    • 对于初学者来说,XPath 和 CSS 在性能上没有显着差异。
    • 在旧版浏览器(如 IE8)中遍历 DOM 不适用于 CSS,但可用于 XPath。并且 XPath 可以向上遍历 DOM(例如从子到父),而 CSS 只能向下遍历 DOM(例如从父到子)。然而,无法在旧版浏览器中使用 CSS 遍历 DOM 并不一定是坏事,因为它更多地表明您的页面设计不佳并且可以从一些有用的标记中受益。
    • 支持 CSS 的一个论点是它们更具可读性、简短和简洁,同时它是一个主观调用。
    • Ben Burton 提到您应该使用 CSS 因为这就是应用程序的构建方式。这使得测试更容易编写、讨论和让其他人帮助维护。
    • Adam Goucher 说要采用一种更加混合的方法——首先关注 ID,然后 CSS,并且仅在需要时才利用 XPath(例如走上 DOM)并且 XPath 对于高级定位器来说总是更强大。
    • 您可以在
    • 中找到详细的讨论

结论

考虑到上述因素,您需要:

  • Properly configure Implicit / Explicit Waits and pageLoadTimeout through Selenium
  • 明智地实施 以及上面讨论的其他方法,这将帮助您摆脱 超时
  • 您可以在
  • 中找到详细的讨论