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)");
  }
}
38
demandé sur Paul D. Waite 2010-07-19 21:17:32

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..

8
répondu Andre 2012-02-17 01:29:24

C'est plus facile de faire ceci:

driver.findElements(By.linkText("myLinkText")).size() < 1
30
répondu Sarhanis 2012-11-30 14:34:22

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 */ 
    }
}
12
répondu Sergii Pozharov 2010-07-20 09:01:36

Il y a une Classe appelée ExpectedConditions:

  By loc = ...
  Boolean notPresent = ExpectedConditions.not(ExpectedConditions.presenceOfElementLocated(loc)).apply(getDriver());
  Assert.assertTrue(notPresent);
6
répondu Fabian Barney 2013-06-10 14:35:48

Avec Selenium Webdriver serait quelque chose comme ceci:

assertTrue(!isElementPresent(By.linkText("Empresas en Misión")));
4
répondu user1732136 2013-10-03 23:56:12

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;
    }
}
2
répondu some_other_guy 2012-10-01 07:01:27
boolean titleTextfield = driver.findElement(By.id("widget_polarisCommunityInput_113_title")).isDisplayed();
assertFalse(titleTextfield, "Title text field present which is not expected");
1
répondu Ripon Al Wasim 2012-07-31 06:28:52

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...

1
répondu df778899 2017-10-05 05:53:50

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.

0
répondu Petr Mensik 2013-06-28 14:48:16

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))
            }
0
répondu QualiT 2017-06-19 21:47:21

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
0
répondu DerMike 2018-09-20 13:47:12

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;
}
-1
répondu some_other_guy 2012-10-01 09:23:30

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());
-1
répondu DrPatience 2016-11-29 09:43:33