2

我在 Java 中有一个 selenium 测试,我正在做一些这样的断言:

assertFalse(isElementPresent(By.xpath("//td[2]/div")));

private boolean isElementPresent(By by) {
try { driver.findElement(by); return true; }
catch (NoSuchElementException e) { 
return false; }

这是从 IDE 导出到 Java Webdriver 时 Selenium 生成的标准方法。

(是的,我想断言这个元素不存在)

当我在上面的代码行进行测试时,我总是遇到错误错误:过时的元素引用:元素未附加到 DOM

但是,当我在该步骤前面放置一个 thread.sleep 时,它可以工作。我不明白的事实是等待 1 毫秒就足够了。在断言之前等待是典型的吗?还有其他方法可以解决这个问题吗?(隐式等待在这里没有帮助)来自德国的问候!

4

2 回答 2

1

当您在函数中面临staleelementreferenceexceptionassertFalse()时,要否定FalsePossitive 用例,您可以在函数内将ExpectedConditions子句设置为stalenessOf来诱导WebDriverWait,如下所示:assertTrue()

Assert.assertTrue(new WebDriverWait(driver, 20).until(ExpectedConditions.stalenessOf(driver.findElement(By.xpath("//td[2]/div")))));

解释

ExpectedConditions子句stalenessOf将检查标识为 的元素的陈旧性(By.xpath("//td[2]/div"))。当预期的元素变得陈旧时,您可以检查assertTrue(boolean condition). assertTrue()会断言一个条件为真。如果不是,则会引发AssertionError

断言假(条件)

如果您仍想实施引发错误的FalsePossitive案例,您仍然可以:assertFalse(condition)

Assert.assertFalse(new WebDriverWait(driver, 20).until(ExpectedConditions.stalenessOf(driver.findElement(By.xpath("//td[2]/div")))));
于 2018-03-12T10:41:45.317 回答
0

我认为,超时未设置为 WebDriver。尝试这个

assertFalse(isElementPresent(By.xpath("//td[2]/div")));

private boolean isElementPresent(By by) {
driver.timeouts().implicitlyWait(5, TimeUnit.SECONDS);
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
try { driver.findElement(by); return true; }
catch (NoSuchElementException e) { 
return false; }
于 2018-03-12T11:31:13.237 回答