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)");
}
}
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
Etc..
C'est plus facile à faire:
driver.findElements(By.linkText("myLinkText")).size() < 1
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 */
}
}
Il existe une classe appelée ExpectedConditions
:
By loc = ...
Boolean notPresent = ExpectedConditions.not(ExpectedConditions.presenceOfElementLocated(loc)).apply(getDriver());
Assert.assertTrue(notPresent);
Avec Selenium Webdriver, cela ressemblerait à ceci:
assertTrue(!isElementPresent(By.linkText("Empresas en Misión")));
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;
}
}
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 ...
boolean titleTextfield = driver.findElement(By.id("widget_polarisCommunityInput_113_title")).isDisplayed();
assertFalse(titleTextfield, "Title text field present which is not expected");
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
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))
}
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.
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