Утверждают, что WebElement отсутствует с помощью Selenium WebDriver с java
в тестах, которые я пишу, если я хочу утверждать, что веб-элемент присутствует на странице, Я могу сделать простой:
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)");
}
}
13 ответов
Не уверен, какую версию selenium вы имеете в виду, однако некоторые команды в selenium * теперь могут это сделать: http://release.seleniumhq.org/selenium-core/0.8.0/reference.html
- assertNotSomethingSelected
- assertTextNotPresent
Etc..
Я думаю, что вы можете просто поймать 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 */
}
}
существует класс под названием ExpectedConditions
:
By loc = ...
Boolean notPresent = ExpectedConditions.not(ExpectedConditions.presenceOfElementLocated(loc)).apply(getDriver());
Assert.assertTrue(notPresent);
с Selenium Webdriver будет что-то вроде этого:
assertTrue(!isElementPresent(By.linkText("Empresas en Misión")));
попробуйте это -
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;
}
}
boolean titleTextfield = driver.findElement(By.id("widget_polarisCommunityInput_113_title")).isDisplayed();
assertFalse(titleTextfield, "Title text field present which is not expected");
похоже 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);
}
все еще ищет способ полностью избежать тайм-аута...
Вы использует Arquillian Графен база для этого. Таким примером для вашего случая может быть
Graphene.element(By.linkText(text)).isPresent().apply(driver));
также предоставляет вам кучу хороших API для работы с Ajax, fluent waits, объектами страниц, фрагментами и так далее. Это определенно облегчает разработку тестов на основе селена.
для узла.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))
}
Не ответ на сам вопрос, но, возможно, идея для базовых задач:
когда логика вашего сайта не должна показывать определенный элемент, вы можете вставить невидимый элемент "флаг", который вы проверяете.
if condition
renderElement()
else
renderElementNotShownFlag() // used by Selenium test
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;
}
для appium 1.6.0 и выше
WebElement button = (new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.xpath("//XCUIElementTypeButton[@name='your button']"))));
button.click();
Assert.assertTrue(!button.isDisplayed());