【问题标题】:What to do when waiting for an element is not enough?当等待一个元素不够时怎么办?
【发布时间】:2015-03-14 01:17:35
【问题描述】:

我正在使用 webdriver 在与元素交互之前等待的行业标准编写 selenium 测试脚本,但我仍然经常发现我的测试失败,这似乎是由于竞争条件造成的。

这是我最近遇到的例子:

  1. 转到产品目录页面
  2. 应用过滤器
  3. 等待过滤器应用
  4. 点击应用过滤器后加载的产品上的保存按钮

第 4 步仅在我将 Thread.Sleep() 放在步骤前面时才有效 - 使用 webdriverwait 还不够。我猜这是因为 webdriverwait 只等到元素附加到 DOM,即使相关的 JavaScript 点击事件尚未添加到元素。

您如何解决这个问题?是否有处理这种竞争条件的行业标准?

编辑 升级到最新版本的 Firefox 解决了这个问题。谢谢大家!

【问题讨论】:

  • 去掉线程休眠的时候报什么错?是否在应用过滤器时禁用按钮并在过滤器应用完成后启用按钮?
  • @shri046 应用过滤器后会加载保存按钮。当我删除 thread.sleep 时,没有错误。 Selenium 将单击保存按钮。问题是当 selenium 点击时没有任何反应(我假设发生这种情况是因为按钮加载后没有附加 javascript 点击事件)。如果我解释得不好,请告诉我。
  • 这是有道理的,但我的问题更多的是在应用过滤器时按钮“变灰”了一小段时间。换句话说,是在应用过滤器之前和之后附加到 DOM 的按钮,唯一的区别是在应用过滤器时启用/禁用按钮。

标签: selenium automation automated-tests


【解决方案1】:

正如我们在 cmets 中发现的那样,将 Firefox 更新到最新版本就成功了。


代码对我来说真的很好,而且完全有意义。

我会尝试在点击之前移动到元素

Actions builder = new Actions(WebDriver);
IWebElement saveButton = wait.Until(ExpectedConditions.ElementIsVisible(By.CssSelector(".button-wishlist")));

Actions hoverClick = builder.MoveToElement(saveButton).Click();
hoverClick.Build().Perform();

正如我们在 cmets 中发现的,该问题与窗口大小有关(如果浏览器窗口最大化,则测试通过而没有 Thread.sleep())。这让我觉得,如果您在点击之前滚动到元素,就足以让它发挥作用:

IWebElement saveButton = wait.Until(ExpectedConditions.ElementIsVisible(By.CssSelector(".button-wishlist")));
((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].scrollIntoView(true);", saveButton);

Actions hoverClick = builder.MoveToElement(saveButton).Click();
hoverClick.Build().Perform();

【讨论】:

  • 我刚刚尝试过,我看到了同样的问题。 :( 测试只通过 Thread.Sleep()
  • @GKS1 感谢您试用。我会更多地使用代码,希望能回到你身边。无论使用哪种浏览器,您都看到这种行为吗?
  • @GKS1 我无法重现该问题。虽然我已经用 python 接近它,但这里是gist。还有一件事要尝试:导航到 URL 后最大化窗口。谢谢。
  • 感谢您对此进行调查。此测试专门用于确保按钮在使用移动视图时正常工作,因此最大化并不是一个真正的选项(出于好奇,我在单击之前确实最大化了浏览器,这导致测试通过而没有睡觉。有趣,但不是很有帮助)
  • @GKS1 这是一种进步。至少我们知道它与窗口的大小有关。按照这个逻辑,移动到元素选项应该有效,对吧?我将再尝试一件事来更新答案。谢谢。
【解决方案2】:

查看this SO post 以了解自定义等待方法。听起来元素存在不足以检查您的情况,因为按钮可能始终存在于 DOM 中。你需要的是类似于ExpectedConditions.elementToBeClickable() 的东西。

我不熟悉 C# API,但似乎没有内置方法可以做与 Java 相同的事情。因此,您可以编写一个自定义等待函数,该函数将根据您的需要进行检查。

【讨论】:

  • 好建议,虽然“可点击元素”基本上检查要启用和可见的元素..不确定它会有所帮助。谢谢。
  • @alecxe 正确。基本框架中的可点击应该适用于大多数通用情况,如果开箱即用不起作用,则只需依赖自定义等待。完全取决于正在测试的 UI 实现,但我想强调这两个选项。
猜你喜欢
  • 1970-01-01
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 2012-04-15
相关资源
最近更新 更多