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

19

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

public void verifyThatCommentDeleted(final String text) throws Exception {
    new WebDriverWait(driver, 5).until(new ExpectedCondition() {
            @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;
                }
            }
        });
    }
В качестве альтернативы можно использоватьWebdriverBackedSelenium» и используйте selenium.isElementPresent ("Локатор"); Manpreet Singh
Прежде всего input.findElements (By.xpath ("// XPath»)). размер ()> 0 лучший способ проверить элемент 'чем обернуть findBy в try..catch. Второе: что вы подразумеваете под "это не работает"? Это висит? Выдает исключение? Возвращает неверные результаты? JacekM

Ваш Ответ

7   ответов
3

findElements вместоfindElement.

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

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

if(elements.size()>0){
    do this..
 } else {
    do that..
 }
Добро пожаловать на ТАК! Хотя это правильный (и хорошо отформатированный) ответ, он уже указан в разделе ответов ис 5 лет, так что это не такне принесет ничего нового на стол. Посмотрите на оставшиеся без ответа вопросы, чтобы начать помогать! JNYRanger
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;
  }
}
как проверить идентификатор, увеличив значение I, это исключение Avijit Samal
Это бросает исключение. Я собирался упомянуть об этом. Правильный способ сделать это, чтобы получить длину "findElements» и посмотреть, равно ли оно "0" или нет. Если оно's 0, тогда элемент НЕ существует. Если оно'с больше чем 1, элемент все еще присутствует. Единственное, что может убить эту логику, - это если на странице есть несколько элементов с одинаковым ИД или ИМЯ. В этом случае вы можете поговорить с командой разработчиков ИЛИ просто получить это другим способом, таким как XPath. IamBatman
Очевидно, мое редактирование было отклонено, поэтому здесь был мой комментарий в редактировании. ""WebElementdisplay» приведет к ошибке, нужен пробелWebElement Display ", "я = я + 1 "Просто надо сделать как "я ++», (Display.isDisplayed == true) должно быть просто (display.isDisplayed). " IamBatman
36

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

На самом деле, это то, что рекомендуют официальные документы: "findElement не должен использоваться для поиска несуществующих элементов, используйте findElements (By) и вместо этого утвердите ответ нулевой длины. " Javadoc для WebElement # findElement sleske
2

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

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

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

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;
};
</webdriver,></webdriver></webdriver>

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

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

    Assert.assertFalse(element.isDisplayed());

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

Он выдаст исключение на 1-й строке, поскольку такого элемента нет Ostap Elyashevskyy
0
WebElement element = driver.findElement(locator);
Assert.assertNull(element);

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