【问题标题】:Selenium WebDriver stale element because test is faster than UI when using Knockout.jsSelenium WebDriver 陈旧元素,因为使用 Knockout.js 时测试比 UI 更快
【发布时间】:2016-07-01 22:01:07
【问题描述】:

我有一个使用 Knockout.js 填充列表的 HTML 页面。

当我点击一个按钮时,一个项目被添加到列表中。

我写 Selenium WebDriver 测试:

  • 我找到了按钮,然后点击它。
  • 然后我找到了新元素。
  • 然后我测试新元素的文本。

我得到一个过时的元素异常。

如果我在单击后等待(在调试器中暂停,或添加大约 500 毫秒的 Thread.Sleep),则测试通过。

如何确保我找到的元素没有过期? WebDriver 给我的属性是否可以测试?

【问题讨论】:

标签: c# knockout.js selenium-webdriver


【解决方案1】:

您可以定义隐式等待以确保元素在与其交互之前存在

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));

这将等待两个 10 秒,让元素存在于 DOM 中

可能会有额外的 JS 更改,因此您可以使用显式等待 expected conditions

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.TextToBePresentInElementLocated(By.id("id"), "text"));
// do something with the element

这将等待两个 10 秒,让元素包含文本。

【讨论】:

  • 我实际上是这样做的,如果我不等待,当我尝试访问元素的文本时仍然会收到 StaleElementException。这就是为什么它对我来说如此奇怪。
  • Knockout.js 是否有可能在添加元素时改变了它多次添加的元素的可见性/附件?
  • @ItaiBar-Haim 是的。如果我认为该元素已从 DOM 中删除,然后重新添加到其中。尝试使用文本接受条件之一,例如wait.until(ExpectedConditions.TextToBePresentInElementLocated(By.id("id"), "text"));
  • 我真的不想去那里,因为我不认为这是一个强大的解决方案(无论如何,等待元素的文本感觉不对),但不幸的是,这似乎是唯一的方法去。谢谢。
  • @ItaiBar-Haim 我能想到的唯一其他选择是使用Thread.Sleep。你需要决定哪一个是较小的邪恶。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2013-04-16
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多