t.me/atinfo_chat Telegram группа по автоматизации тестирования

Проверка отсутствия элемента

Здравствуйте

я новичок в тестировании

подскажите, пожалуйста, как проверить отсутсвие элемента на странице (чтобы тест проходился, когда элемента с конкретным id или xpath нет на странице)

я использую selenium webdriver, пишу на python

спасибо

Здравствуйте Антон,

Я использую Java, надеюсь Вы сможете переделать на Python-e.

public static void waitForElementToDisappear(final By byLocator) {

  General.sendComments("Wait for: " + byLocator);

  WebDriverHelper.setLowImplicitlyWait();

  ExpectedCondition<Boolean> e = new ExpectedCondition<Boolean>() {
   public Boolean apply(WebDriver d) {
    try {
     return !WebDriverHelper.getInstance().getDriver()
       .findElement(byLocator).isDisplayed();
    } catch (Exception e) {
     return true;
    }
   }
  };

  WebDriverWait w = new WebDriverWait(WebDriverHelper.getInstance()
    .getDriver(), WebDriverHelper.LARGE_SEC_TO_WAIT);
  w.until(e);
 
  WebDriverHelper.setDefaultImplicitlyWait();
}

Удачи!

можна просто еще проверять пропертю visible, hidden в html - ну если она там есть

element = WebDriverWait(driver, 10).until_not(lambda driver: driver.find_element_by_id(“someId”).is_displayed())

к сожалению, я думаю, новичек не сможет такой код перевести в аналог на python :)

1 Симпатия

Тут был пример кривого кода. Он удалён, а автор получил по рукам учебником "Питон для чайников"..)

это что за код такой был?

Какой-то дико сложный код вы приводите на Java

    public boolean isElementPresent("locator") {
        try {
            driver.findElement(locator);
            return true;
        } catch (NoSuchElementException e) {
            return false;
        }
    }

потом проверка отсуствия элемента:

assertFalse(isElementPresent("locator"));

всякие

isDisplayed и т.п. не нужны

можно просто попытаться найти элемент по xpath-у и словить ексепшен его отсутствия.

driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);

try {

WebElement element = driver.findElement(By.xpath("your_xpath"));

} catch (NoSuchElementException e) {

// Element wasn't found. Do something here

}

Такую конструкцию можно просто перевести на питон.

WebElement findElement(By by)

Find the first WebElement using the given method. See the note in findElement(By) about finding via XPath. This method is affected by

the ‘implicit wait’ times in force at the time of execution. The
findElement(…) invocation will return a matching row, or try again
repeatedly until the configured timeout is reached. findElement should
not be used to look for non-present elements, use findElements(By) and
assert zero length response instead.

Returns:
    The first matching element on the current context.
Throws:
    NoSuchElementException - If no matching elements are found
1 Симпатия

driver.findElements(locator).size() - если 0, то элемента нет и ошибка бросаться не будет

1 Симпатия

да, это еще проще конструкция. хорошая идея.

всем большое спасибо

Можно ли проверить элемент на странице, без остановки самого теста и при этом не использовать конструкцию try, except. Но сообщение о том, что элемент отсутствует вывести нужно. Если можно, то подскажите плз как это сделать.

Ответ уже писали выше:

if (findElements(locator).size() == 0)
            logger.warn("There's no such element on the page.");

Спасибо, но этот вариант мне не подходит. Выдает ошибку. В итоге обернул в try, except.

А что за ошибку выдает?

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

а почему вы не можете использовать try, except

Если искать 1 элемент -

driver.find_element_by_class_name("не существующий локатор").size() == 0):

, то выводит ошибку

"NoSuchElementException: Message: u'Unable to locate element: {"method":"class name","selector":"spec1"}'"

Если, как в примере, то - AttributeError: ‘list’ object has no attribute ‘size’.

Хотел узнать существуют ли другие методы. Может они работают быстрее или писанины меньше. Я все таки только начинаю и многое не понятно.
По теме мне нужно на странице все блоки отловить, чтобы если отвалились, то вывести ошибку. В итоге использовал конструкцию с try, except.

в python webdriver, size это не метод, а атрибут класса, т.е. надо вот так вот

driver.find_element_by_class_name("не существующий локатор").size == 0