1

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

基本上我在我的脚本中使用了下面的每一个并运行了测试,虽然在每种情况下脚本都在运行,但我发现脚本执行持续时间的速度几乎没有提高。我正在使用等待

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

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

4

2 回答 2

3

您的方法存在一些问题。

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

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

  3. 主要问题是您在检查不存在的东西时启用了隐式等待......尤其是 10 秒的等待。这意味着每次检查一个元素时,Selenium 都会等待 10 秒,即使它预计它不存在。

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

旁注... Selenium 贡献者已经声明不应该使用隐式等待。改用WebDriverWait,但那是另一回事了。

于 2018-12-14T14:29:28.777 回答
3

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

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

  • 所以第一步是摆脱所有隐式等待并用 WebDriverWait 替换它们

  • driver.findElements(By.xpath("Element Xpath)).size()>0:findElement()并且findElements()受执行时有效的“隐式等待”时间的影响。调用将findElement(..)返回匹配的行,或重复尝试,直到达到配置的超时。findElement()不应该用于寻找不存在的元素,而是使用findElements(By)assert零长度响应。所有这些都增加了很多开销。相反,我会推荐一个try-catch {}具有明确定位器策略的块,在发生错误的情况下捕获异常并继续前进。

  • 您可以在 Selenium 的 try catch 块中使用 isDisplayed() 方法在 NoSuchElementException 中找到详细讨论
  • 根据当前的WebDriver-W3C 建议,以下是首选定位器策略列表:

定位器策略_W3C

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

结论

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

于 2018-12-17T11:53:19.143 回答