Вопрос по verify, assertion, java, selenium-webdriver – Лучший способ проверить, что элемента нет, используя Selenium WebDriver с Java

19

Я пытаюсь код ниже, но кажется, что он не работает ... Может кто-нибудь показать мне лучший способ сделать это?

public void verifyThatCommentDeleted(final String text) throws Exception {
    new WebDriverWait(driver, 5).until(new ExpectedCondition<Boolean>() {
            @Override
            public Boolean apply(WebDriver input) {
                try {
                    input.findElement(By.xpath(String.format(
                            Locators.CHECK_TEXT_IN_FIRST_STATUS_BOX, text)));
                    return false;
                } catch (NoSuchElementException e) {
                    return true;
                }
            }
        });
    }
В качестве альтернативы вы можете использовать & quot; WebdriverBackedSelenium & quot; и используйте selenium.isElementPresent (& quot; Локатор & quot;); Manpreet Singh
Прежде всего input.findElements (By.xpath (& quot; // xpath & quot;)). Size () & gt; 0 лучший способ проверить существование элемента, чем перенос findBy в try..catch. Второе: что вы подразумеваете под «не работает»? Это висит? Выдает исключение? Возвращает неверные результаты? JacekM

Ваш Ответ

7   ответов
36

найдите findElements и убедитесь, что длина возвращаемых элементов равна 0. Это то, что я делаю с помощью WebdriverJS, и я ожидаю, что то же самое будет работать в Java.

На самом деле, это также то, что рекомендуют официальные документы:"findElement should not be used to look for non-present elements, use findElements(By) and assert zero length response instead." Javadoc for WebElement#findElement
3

findElements вместоfindElement.

findElements вернет пустой список, если не найдены подходящие элементы вместо исключения. Также мы можем убедиться, что элемент присутствует или нет.

Пример: List elements = driver.findElements (By.yourlocatorstrategy);

if(elements.size()>0){
    do this..
 } else {
    do that..
 }
Добро пожаловать на ТАК! Хотя это правильный (и хорошо отформатированный) ответ, он уже указан в разделе ответов и ему почти 5 лет, так что он действительно не приносит ничего нового в таблицу. Посмотрите на оставшиеся без ответа вопросы, чтобы начать помогать!
0
int i=1;

while (true) {
  WebElementdisplay=driver.findElement(By.id("__bar"+i+"-btnGo"));
  System.out.println(display);

  if (display.isDisplayed()==true)
  { 
    System.out.println("inside if statement"+i);
    driver.findElement(By.id("__bar"+i+"-btnGo")).click();
    break;
  }
  else
  {
    System.out.println("inside else statement"+ i);
    i=i+1;
  }
}
Очевидно, мое редактирование было отклонено, поэтому здесь был мой комментарий в редактировании. & quot; WebElementdisplay & quot; может привести к ошибке, требуется пробел "отображение WebElement". «I = i + 1» просто следует сделать как «i ++». (Display.isDisplayed == true) должно быть просто (display.isDisplayed). & Quot;
Это бросает исключение. Я собирался упомянуть об этом. Правильный способ сделать это - получить длину & quot; findElements & quot; и посмотрите, равно ли оно "0" или нет. Если оно равно 0, то элемент НЕ существует. Если оно больше, чем «1», элемент все еще присутствует. Единственное, что может убить эту логику, - это если на странице есть несколько элементов с одинаковым ИД или ИМЯ. В этом случае вы можете поговорить с командой разработчиков ИЛИ просто получить это другим способом, таким как XPath.
как проверить идентификатор, увеличив значение I, это исключение
0
    WebElement element = driver.findElement(locator);

    Assert.assertFalse(element.isDisplayed());

если элемент отсутствует, в противном случае произойдет сбой.

Он выдаст исключение на 1-й строке, поскольку такого элемента нет
24

public boolean isElementPresent(By locatorKey) {
    try {
        driver.findElement(locatorKey);
        return true;
    } catch (org.openqa.selenium.NoSuchElementException e) {
        return false;
    }
}

public boolean isElementVisible(String cssLocator){
    return driver.findElement(By.cssSelector(cssLocator)).isDisplayed();
}

Обратите внимание, что иногда селен может находить элементы в DOM, но они могут быть невидимыми, следовательно, селен не сможет взаимодействовать с ними. Так что в этом случае помогает проверка метода на видимость.

Если вы хотите подождать, пока элемент не появится, лучшее решение, которое я нашел, это использовать свободное ожидание:

public WebElement fluentWait(final By locator){
    Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
            .withTimeout(30, TimeUnit.SECONDS)
            .pollingEvery(5, TimeUnit.SECONDS)
            .ignoring(NoSuchElementException.class);

    WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
        public WebElement apply(WebDriver driver) {
            return driver.findElement(locator);
        }
    });

    return foo;
};

Надеюсь это поможет)

Потенциальное предложение для isElementVisible: public boolean isElementVisible (By locatorKey) {return driver.findElement (locatorKey) .isDisplayed (); } Спасибо за ваши комментарии.
Ваш код, вероятно, страдает от состояния гонки: элемент может быть удален между вызовамиfindElement а такжеisDisplayed - значит, вы получите случайнымStaleElementReferenceExceptions.
@sleske, каждый случай должен рассматриваться особенно, то есть нам нужно решить для элемента: 1) присутствует ли он на странице / нет 2) vsibile / не виден. Таким образом, combo fluentWait (#selector) .isDisplayed () будет обрабатывать это, потому что: 1) если элемент не представлен & gt; & gt; исключение noSuchElement 2) если присутствует элемент & gt; & gt; тогда мы получаем boolen для его видимости.
2

так как у меня нет представителя, но я хотел привести пример, который потребовал у меня довольно много времени, чтобы выяснить:

Assert.assertEquals(0, wd.findElements(By.locator("locator")).size());

Это утверждение проверяет, что в DOM нет соответствующих элементов, и возвращает значение Zero, поэтому утверждение проходит, когда элемент отсутствует. Также он потерпит неудачу, если он будет присутствовать.

0
WebElement element = driver.findElement(locator);
Assert.assertNull(element);

Похожие вопросы