等待元素不够时怎么办?
What to do when waiting for an element is not enough?
我正在使用 webdriver 在与元素交互之前等待的行业标准编写 selenium 测试脚本,但我仍然经常发现我的测试失败,这似乎是由于竞争条件。
这是我最近 运行 的例子:
- 转到产品目录页面
- 应用过滤器
- 等待应用过滤器
- 在应用过滤器后加载的产品上单击保存按钮
只有在步骤前面放置 Thread.Sleep() 时,第 4 步才有效 - 使用 webdriverwait 是不够的。我猜这是因为 webdriverwait 只等到元素附加到 DOM,即使相关的 JavaScript 单击事件尚未添加到元素。
你是如何解决这个问题的?是否有处理这种竞争条件的行业标准?
编辑 这已通过升级到最新版本的 firefox 解决。谢谢大家!
正如我们在评论中发现的那样,将 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();
正如我们在评论中发现的那样,该问题与 window 的大小有关(如果浏览器 window 已最大化,则测试通过时没有 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();
看看this SO post for custom wait method. Sounds like element presence is not enough of a check in your case because the button may be present at all times in the DOM. What you need is something along the lines of ExpectedConditions.elementToBeClickable()。
我不熟悉 C# API,但似乎没有内置方法来执行与 Java 中相同的操作。因此,您可以编写一个自定义等待函数,根据您的需要进行检查。
我正在使用 webdriver 在与元素交互之前等待的行业标准编写 selenium 测试脚本,但我仍然经常发现我的测试失败,这似乎是由于竞争条件。
这是我最近 运行 的例子:
- 转到产品目录页面
- 应用过滤器
- 等待应用过滤器
- 在应用过滤器后加载的产品上单击保存按钮
只有在步骤前面放置 Thread.Sleep() 时,第 4 步才有效 - 使用 webdriverwait 是不够的。我猜这是因为 webdriverwait 只等到元素附加到 DOM,即使相关的 JavaScript 单击事件尚未添加到元素。
你是如何解决这个问题的?是否有处理这种竞争条件的行业标准?
编辑 这已通过升级到最新版本的 firefox 解决。谢谢大家!
正如我们在评论中发现的那样,将 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();
正如我们在评论中发现的那样,该问题与 window 的大小有关(如果浏览器 window 已最大化,则测试通过时没有 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();
看看this SO post for custom wait method. Sounds like element presence is not enough of a check in your case because the button may be present at all times in the DOM. What you need is something along the lines of ExpectedConditions.elementToBeClickable()。
我不熟悉 C# API,但似乎没有内置方法来执行与 Java 中相同的操作。因此,您可以编写一个自定义等待函数,根据您的需要进行检查。