Ответ 1
Не уверен, какую версию селена вы имеете в виду, однако некоторые команды в selenium * теперь могут сделать это: http://release.seleniumhq.org/selenium-core/0.8.0/reference.html
- assertNotSomethingSelected
- assertTextNotPresent
Etc..
В тестах, которые я пишу, если я хочу утверждать, что WebElement присутствует на странице, я могу сделать простой:
driver.findElement(By.linkText("Test Search"));
Это будет проходить, если оно существует, и оно будет бомбить, если оно не существует. Но теперь я хочу сказать, что ссылки не существует. Я не понимаю, как это сделать, поскольку приведенный выше код не возвращает логическое значение.
EDIT Вот как я придумал свое собственное решение, мне интересно, есть ли еще лучший выход.
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)");
}
}
Не уверен, какую версию селена вы имеете в виду, однако некоторые команды в selenium * теперь могут сделать это: http://release.seleniumhq.org/selenium-core/0.8.0/reference.html
Etc..
Это проще сделать:
driver.findElements(By.linkText("myLinkText")).size() < 1
Я думаю, что вы можете просто поймать 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 для этого. Итак, примером для вашего случая может быть
Graphene.element(By.linkText(text)).isPresent().apply(driver));
Также предоставляет вам кучу приятного API для работы с Ajax, безупречные ожидания, объекты страниц, фрагменты и т.д. Это определенно облегчает разработку тестов на основе селена.
Для 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))
}
Не ответ на сам вопрос, но, возможно, идея для основной задачи:
Когда логика вашего сайта не должна отображать определенный элемент, вы можете вставить невидимый элемент "flag", который вы проверяете.
if condition
renderElement()
else
renderElementNotShownFlag() // used by Selenium test
Ниже приведен пример использования Selenium "till.stalenessOf" и утверждения Jasmine. Возвращает true, когда элемент больше не подключен к DOM.
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);
});
Для справки: Селен: До Док
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());