Affirmer qu'un WebElement n'est pas présent en utilisant Selenium WebDriver avec java
dans les tests que j'écris, si je veux affirmer qu'un WebElement est présent sur la page, je peux faire un simple:
driver.findElement(By.linkText("Test Search"));
cela passera s'il existe et il explosera s'il n'existe pas. Mais maintenant, je veux affirmer qu'un lien n' existent. Je ne sais pas comment faire puisque le code ci-dessus ne renvoie pas un booléen.
EDIT C'est comme ça que j'ai trouvé ma propre solution, je me demande s'il y a une meilleure solution encore.
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 réponses
Pas Sûr de la version de sélénium vous faites référence, cependant certaines commandes en sélénium * pouvez désormais le faire: http://release.seleniumhq.org/selenium-core/0.8.0/reference.html
- assertNotSomethingSelected
- assertTextNotPresent
etc..
C'est plus facile de faire ceci:
driver.findElements(By.linkText("myLinkText")).size() < 1
je pense que vous pouvez juste attraper org.openqa.selenium.NoSuchElementException
qui sera renvoyée par driver.findElement
si il n'y a pas d'élément:
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 */
}
}
Il y a une Classe appelée ExpectedConditions
:
By loc = ...
Boolean notPresent = ExpectedConditions.not(ExpectedConditions.presenceOfElementLocated(loc)).apply(getDriver());
Assert.assertTrue(notPresent);
Avec Selenium Webdriver serait quelque chose comme ceci:
assertTrue(!isElementPresent(By.linkText("Empresas en Misión")));
Essayez ce -
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");
Il ressemble à findElements()
ne retourne rapidement si il trouve au moins un élément. Sinon, il attend le délai d'attente implicite, avant de retourner zéro éléments - comme findElement()
.
pour garder la vitesse du test bonne, cet exemple raccourcit Temporairement l'attente implicite, en attendant que l'élément disparaisse:
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);
}
Toujours à la recherche d'un moyen d'éviter le délai d'attente complètement...
Vous pouvez utlilize Arquillian Graphène cadre pour cela. Donc, exemple pour votre cas pourrait être
Graphene.element(By.linkText(text)).isPresent().apply(driver));
Is vous fournit également un tas de bonnes API pour travailler avec Ajax, des waits fluents, des objets de page, des fragments et ainsi de suite. Il facilite certainement un développement de test basé sur le sélénium beaucoup.
pour noeud.js j'ai trouvé que ce qui suit est un moyen efficace d'attendre qu'un élément ne soit plus présent:
// 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))
}
ce n'est Pas une réponse à la question, mais peut-être une idée pour les tâches sous-jacent:
lorsque la logique de votre site ne devrait pas afficher un certain élément, vous pouvez insérer un élément invisible "flag" que vous vérifiez.
if condition
renderElement()
else
renderElementNotShownFlag() // used by Selenium test
findElement vérifiera la source html et retournera true même si l'élément n'est pas affiché. Pour vérifier si un élément est affiché ou la non-utilisation -
private boolean verifyElementAbsent(String locator) throws Exception {
boolean visible = driver.findElement(By.xpath(locator)).isDisplayed();
boolean result = !visible;
System.out.println(result);
return result;
}
pour l'appium 1.6.0 et plus
WebElement button = (new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.xpath("//XCUIElementTypeButton[@name='your button']"))));
button.click();
Assert.assertTrue(!button.isDisplayed());