web-dev-qa-db-fra.com

Confirmer l'absence de WebElement à l'aide de 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 bombardera s'il n'existe pas. Mais maintenant, je veux affirmer qu'un lien existe pas. Je ne sais pas comment faire car le code ci-dessus ne renvoie pas de booléen.

EDIT Voici comment j'ai créé mon propre correctif. Je me demande s'il existe encore une meilleure solution.

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
True_Blue

Vous ne savez pas à quelle version de Selenium vous faites référence, mais certaines commandes de Selenium * peuvent désormais le faire: http://release.seleniumhq.org/Selenium-core/0.8.0/reference.html

  • assertNonQuelqueChoseSélectionné 
  • assertTextNotPresent 

Etc..

8
Andre

C'est plus facile à faire:

driver.findElements(By.linkText("myLinkText")).size() < 1
34
Sarhanis

Je pense que vous pouvez simplement attraper org.openqa.Selenium.NoSuchElementException qui sera lancé par driver.findElement s'il n'y a pas un tel é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
Sergii Pozharov

Il existe une classe appelée ExpectedConditions:

  By loc = ...
  Boolean notPresent = ExpectedConditions.not(ExpectedConditions.presenceOfElementLocated(loc)).apply(getDriver());
  Assert.assertTrue(notPresent);
6
Fabian Barney

Avec Selenium Webdriver, cela ressemblerait à ceci:

assertTrue(!isElementPresent(By.linkText("Empresas en Misión")));
4
user1732136

Essaye ça -

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
some_other_guy

Il semble que findElements() ne retourne rapidement que s’il trouve au moins un élément. Sinon, il attend le délai d'attente implicite avant de renvoyer zéro élément, tout comme findElement().

Pour que la vitesse du test reste correcte, cet exemple raccourcit temporairement l'attente implicite, en attendant la disparition de l'élément:

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);
}

Vous cherchez toujours un moyen d'éviter complètement le délai d'attente ...

1
df778899
boolean titleTextfield = driver.findElement(By.id("widget_polarisCommunityInput_113_title")).isDisplayed();
assertFalse(titleTextfield, "Title text field present which is not expected");
1
Ripon Al Wasim

Veuillez trouver ci-dessous des exemples d'utilisation de Selenium "Until.stalenessOf" et de l'assertion Jasmine. Il renvoie true lorsque l'élément n'est plus attaché au 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);
});

Pour référence: Selenium: Until Doc

0

Pour node.js, j’ai trouvé ce qui suit comme moyen efficace d’attendre la disparition d’un élément:

// 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
QualiT

Vous pouvez utiliser Arquillian Graphene framework pour cela. Donc, exemple pour votre cas pourrait être 

Graphene.element(By.linkText(text)).isPresent().apply(driver));

Vous fournit également un ensemble d’API Nice permettant de travailler avec Ajax, des attentes fluides, des objets de page, des fragments, etc. Cela facilite grandement le développement de tests basés sur le sélénium.

0
Petr Mensik

Pas une réponse à la question même, mais peut-être une idée pour la tâche sous-jacente:

Lorsque la logique de votre site ne doit pas afficher un élément donné, vous pouvez insérer un élément "indicateur" invisible que vous recherchez.

if condition
    renderElement()
else
    renderElementNotShownFlag() // used by Selenium test
0
DerMike