我在Java中有一个硒测试,我正在做一些这样的断言:
assertFalse(isElementPresent(By.xpath("//td[2]/div")));
private boolean isElementPresent(By by) {
try { driver.findElement(by); return true; }
catch (NoSuchElementException e) {
return false; }
这是Selenium从IDE导出到Java Webdriver时生成的标准方法。
(是的,我想断言这个元素不存在(
当我在上面的代码行进行测试时,我总是收到错误错误:过时的元素引用:元素未附加到 DOM
但是当我在该步骤前面放置一个thread.sleep时,它可以工作。我不明白的事实是,等待 1 毫秒就足够了。在断言之前等待是典型的吗?有没有其他方法可以解决这个问题?(隐式等待在这里无济于事(来自德国的问候!
由于您在assertFalse()
函数中面临 staleelementreferenceexception,为了否定 FalsePossitive 用例,您可以在函数中将 WebDriverWait 与 ExpectConditions 子句设置为 stalenessOf assertTrue()
如下所示:
Assert.assertTrue(new WebDriverWait(driver, 20).until(ExpectedConditions.stalenessOf(driver.findElement(By.xpath("//td[2]/div")))));
解释
预期条件子句 staleness Of 将检查标识为 (By.xpath("//td[2]/div"))
的元素的过期性。当预期的元素过时时,您可以检查assertTrue(boolean condition)
。 assertTrue()
会断言一个条件是真的。如果不是,则会引发断言错误。
断言假(条件(
如果您仍然想实现assertFalse(condition)
引发错误的 FalsePossitive 案例,您仍然可以:
Assert.assertFalse(new WebDriverWait(driver, 20).until(ExpectedConditions.stalenessOf(driver.findElement(By.xpath("//td[2]/div")))));
我认为,超时没有设置为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; }