Утверждают, что WebElement отсутствует при использовании Selenium WebDriver с Java - PullRequest
39 голосов
/ 19 июля 2010

В тестах, которые я пишу, если я хочу утверждать, что WebElement присутствует на странице, я могу сделать следующее:

driver.findElement(By.linkText("Test Search"));

Это пройдет, если оно существует, и будет разорвано, если его не существует. Но теперь я хочу утверждать, что ссылка не существует. Мне неясно, как это сделать, поскольку приведенный выше код не возвращает логическое значение.

РЕДАКТИРОВАТЬ Вот как я придумал собственное исправление, мне интересно, есть ли еще лучший выход.

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

Ответы [ 14 ]

36 голосов
/ 30 ноября 2012

Это проще сделать:

driver.findElements(By.linkText("myLinkText")).size() < 1
12 голосов
/ 20 июля 2010

Я думаю, что вы можете просто поймать 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 */ 
    }
}
9 голосов
/ 17 февраля 2012

Не уверен, на какую версию селена вы ссылаетесь, однако некоторые команды в селене * теперь могут делать это: http://release.seleniumhq.org/selenium-core/0.8.0/reference.html

  • assertNotSomethingSelected
  • assertTextNotPresent

и т. Д.

6 голосов
/ 10 июня 2013

Существует класс под названием ExpectedConditions:

  By loc = ...
  Boolean notPresent = ExpectedConditions.not(ExpectedConditions.presenceOfElementLocated(loc)).apply(getDriver());
  Assert.assertTrue(notPresent);
4 голосов
/ 04 октября 2013

С Selenium Webdriver было бы что-то вроде этого:

assertTrue(!isElementPresent(By.linkText("Empresas en Misión")));
2 голосов
/ 01 октября 2012

Попробуйте это -

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;
    }
}
1 голос
/ 05 октября 2017

Похоже, 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);
}

Все еще ищу способ полностью избежать таймаута ...

1 голос
/ 31 июля 2012
boolean titleTextfield = driver.findElement(By.id("widget_polarisCommunityInput_113_title")).isDisplayed();
assertFalse(titleTextfield, "Title text field present which is not expected");
0 голосов
/ 01 мая 2019

Ниже приведен пример использования 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);
});

Для исх .: Селен: до док.

0 голосов
/ 20 сентября 2018

Не ответ на сам вопрос, но, возможно, идея для основной задачи:

Когда логика вашего сайта не должна отображать определенный элемент, вы можете вставить невидимый элемент "flag", который вы проверяете.

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