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


(anton59197) #1

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

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

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

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

спасибо


(Vol) #2

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

Я использую 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();
}

Удачи!


(Taras) #3

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


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

(Mykhailo Poliarush) #5

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


(re1ax) #6

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


(Mykhailo Poliarush) #7

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


(user12) #8

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

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

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

assertFalse(isElementPresent("locator"));

всякие

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


(syelanin) #9

можно просто попытаться найти элемент по 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

(Леша) #10

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


(syelanin) #11

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


(anton59197) #12

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


(Mentas) #13

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


(Sergey Korol) #14

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

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

(Mentas) #15

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


(Sergey Korol) #16

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


(Mykhailo Poliarush) #17

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

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


(Mentas) #18

Если искать 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’.


(Mentas) #19

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


(Mykhailo Poliarush) #20

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

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