等待元素时该怎么做还不够?

时间:2015-03-13 15:04:49

标签: selenium automation automated-tests

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

这是我最近遇到的例子:

  1. 转到产品目录页面
  2. 应用过滤器
  3. 等待应用过滤器
  4. 单击应用过滤器后加载的产品上的保存按钮
  5. 仅当我在步骤前面放置一个Thread.Sleep()时,步骤4才有效 - 使用webdriverwait是不够的。我猜这是因为webdriverwait仅等待元素附加到DOM,即使相关的JavaScript单击事件尚未添加到元素中。

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

    编辑这是通过升级到最新版本的Firefox来解决的。谢谢大家!

2 个答案:

答案 0 :(得分:1)

正如我们在评论中发现的那样,将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();

正如我们在评论中发现的那样,问题与窗口的大小有关(如果浏览器窗口最大化,则测试在没有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();

答案 1 :(得分:0)

查看this SO post的自定义等待方法。听起来像元素存在是不够的,因为按钮可能始终存在于DOM中。你需要的是ExpectedConditions.elementToBeClickable()

我不熟悉C#API,但看起来没有内置方法可以像在Java中那样做。所以你可以编写一个自定义等待函数,根据你的需要进行检查。