我在与元素交互之前使用webdriver等行业标准编写selenium测试脚本,但我仍然经常发现我的测试失败了,而且似乎是由于竞争条件。
这是我最近遇到的例子:
仅当我在步骤前面放置一个Thread.Sleep()时,步骤4才有效 - 使用webdriverwait是不够的。我猜这是因为webdriverwait仅等待元素附加到DOM,即使相关的JavaScript单击事件尚未添加到元素中。
你如何解决这个问题?是否有处理这种竞争条件的行业标准?
编辑这是通过升级到最新版本的Firefox来解决的。谢谢大家!
答案 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中那样做。所以你可以编写一个自定义等待函数,根据你的需要进行检查。