在我写的测试中,如果我想断言WebElement存在于页面上,我可以做一个简单的事情:
driver.findElement(By.linkText("Test Search"));
如果它存在则会通过,如果它不存在则会弹出。但现在我想断言不的链接存在。我不清楚如何做到这一点,因为上面的代码不返回布尔值。
编辑这就是我提出自己修复的方法,我想知道是否还有更好的方法。
public static void assertLinkNotPresent (WebDriver driver, String text) throws Exception {
List<WebElement> bob = driver.findElements(By.linkText(text));
if (bob.isEmpty() == false) {
throw new Exception (text + " (Link is present)");
}
}
答案 0 :(得分:36)
这样做更容易:
driver.findElements(By.linkText("myLinkText")).size() < 1
答案 1 :(得分:12)
我认为如果没有这样的元素,你可以抓住org.openqa.selenium.NoSuchElementException
抛出的driver.findElement
:
import org.openqa.selenium.NoSuchElementException;
....
public static void assertLinkNotPresent(WebDriver driver, String text) {
try {
driver.findElement(By.linkText(text));
fail("Link with text <" + text + "> is present");
} catch (NoSuchElementException ex) {
/* do nothing, link is not present, assert is passed */
}
}
答案 2 :(得分:9)
不确定您指的是哪个版本的selenium,但selenium *中的某些命令现在可以执行此操作: http://release.seleniumhq.org/selenium-core/0.8.0/reference.html
等。
答案 3 :(得分:6)
有一个名为ExpectedConditions
的类:
By loc = ...
Boolean notPresent = ExpectedConditions.not(ExpectedConditions.presenceOfElementLocated(loc)).apply(getDriver());
Assert.assertTrue(notPresent);
答案 4 :(得分:4)
使用Selenium Webdriver会是这样的:
assertTrue(!isElementPresent(By.linkText("Empresas en Misión")));
答案 5 :(得分:2)
试试这个 -
private boolean verifyElementAbsent(String locator) throws Exception {
try {
driver.findElement(By.xpath(locator));
System.out.println("Element Present");
return false;
} catch (NoSuchElementException e) {
System.out.println("Element absent");
return true;
}
}
答案 6 :(得分:1)
boolean titleTextfield = driver.findElement(By.id("widget_polarisCommunityInput_113_title")).isDisplayed();
assertFalse(titleTextfield, "Title text field present which is not expected");
答案 7 :(得分:1)
看起来findElements()
只有在找到至少一个元素时才会快速返回。否则它会在返回零元素之前等待隐式等待超时 - 就像findElement()
。
为了保持测试的速度,这个例子暂时缩短了隐式等待,等待元素消失:
static final int TIMEOUT = 10;
public void checkGone(String id) {
FluentWait<WebDriver> wait = new WebDriverWait(driver, TIMEOUT)
.ignoring(StaleElementReferenceException.class);
driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
try {
wait.until(ExpectedConditions.numberOfElementsToBe(By.id(id), 0));
} finally {
resetTimeout();
}
}
void resetTimeout() {
driver.manage().timeouts().implicitlyWait(TIMEOUT, TimeUnit.SECONDS);
}
仍在寻找一种完全避免超时的方法......
答案 8 :(得分:0)
您可以为此启用Arquillian Graphene框架。你的案例的例子可能是
Graphene.element(By.linkText(text)).isPresent().apply(driver));
还为您提供了一堆很好的API,用于处理Ajax,流畅的等待,页面对象,片段等。它确实简化了基于Selenium的测试开发。
答案 9 :(得分:0)
对于node.js,我发现以下是等待元素不再存在的有效方法:
// variable to hold loop limit
var limit = 5;
// variable to hold the loop count
var tries = 0;
var retry = driver.findElements(By.xpath(selector));
while(retry.size > 0 && tries < limit){
driver.sleep(timeout / 10)
tries++;
retry = driver.findElements(By.xpath(selector))
}
答案 10 :(得分:0)
不是对这个问题的答案,而是对基本任务的一个想法:
当您的网站逻辑不应该显示某个元素时,您可以插入要检查的不可见“标志”元素。
if condition
renderElement()
else
renderElementNotShownFlag() // used by Selenium test
答案 11 :(得分:0)
请在下面的示例中使用Selenium“ until.stalenessOf”和Jasmine声明。 当element不再附加到DOM时,它将返回true。
const { Builder, By, Key, until } = require('selenium-webdriver');
it('should not find element', async () => {
const waitTime = 10000;
const el = await driver.wait( until.elementLocated(By.css('#my-id')), waitTime);
const isRemoved = await driver.wait(until.stalenessOf(el), waitTime);
expect(isRemoved).toBe(true);
});
答案 12 :(得分:0)
我发现最好的方法-并在“魅力”报告中显示为失败-尝试捕获findelement并在catch块中将assertTrue设置为false,如下所示:
try {
element = driver.findElement(By.linkText("Test Search"));
}catch(Exception e) {
assertTrue(false, "Test Search link was not displayed");
}
答案 13 :(得分:-1)
findElement将检查html源代码,即使未显示该元素,也会返回true。要检查元素是否显示,请使用 -
private boolean verifyElementAbsent(String locator) throws Exception {
boolean visible = driver.findElement(By.xpath(locator)).isDisplayed();
boolean result = !visible;
System.out.println(result);
return result;
}
答案 14 :(得分:-1)
适用于app 1.6.0及以上
WebElement button = (new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.xpath("//XCUIElementTypeButton[@name='your button']"))));
button.click();
Assert.assertTrue(!button.isDisplayed());