Подскажите, как лучше определить наличие элемента на странице.

Идея в том, что хочу кликать по кнопке “all”, результатом будет - исчезновение элемента указанного в while (“formular_title”).
Первое нажатие на кнопку - добавляет все элементы и только повторное нажатие всё очищает (и в том числе указанный элемент в в условии):
Но это решение корявое, приводит к сбоям. Подскажите новичку плиз.

def clear(self):
        while self.is_element_present("formular_title"):
            self.all.click()

Забудьте вообще о циклах при поиске элементов. Посмотрите в сторону WebDriverWait + ExpectedConditions.

2 лайка

Для таких случаев тебе нужно реализовать метод ожидания исчезновения элемента…
Но нужно учесть что сначала этот элемент необходимо найти :smile: То есть у нас 2 случая:

Исчезающий элемент еще не найден###

  1. Ищем webElement по locator By через явные ожидания и ExpectedConditions.presenceOfElementLocated(locator)
  2. Ожидаем пока этот элемент исчезнет с помощью ExpectedConditions.visibilityOf(webElement)

Исчезающий элемент уже не найден###

тогда просто используем вышестоящий пунктик номер 2

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

1 лайк

Я просто оставлю это тут :smile: :

wait = WebDriverWait(self.driver, timeout=int(timeout))
message = "Element '%s' was not visible in %s second(s)." % (xpath, str(timeout))
wait.until(lambda driver: driver.find_element_by_xpath(xpath).is_displayed(), message=message)

ну и так же обратный случай - wait.until_not.

P.S.: если убрать is_displayed() то проверишь есть ли элемент вообще на странице (без разницы видим он или нет)

1 лайк

Чудеса Java 8 ?
Кстати проверь как работает с элементом, который должен исчезнуть… есть крупные сомнения :smile:

Если вы про wait.until_not(lambda driver: driver.find_element_by_xpath(xpath).is_displayed(), message=message), то оно работает. И это магия Python :smile:

Ну python так python :smile:
Но я про другое немного… так ты легко проверишь что найденный элемент видимый… а вот попробуй сделать так чтобы дождаться пока краткоживущий элемент пропадет :smile: (это если я правильно понял задачу от автора)

Да, я если честно не совсем понял что имел в виду автор. Но если нужно дождаться удаления элемента из dom, ток как я и писал можно сделать так:

wait.until_not(lambda driver: driver.find_element_by_xpath(xpath), message=message)

Ну либо JavaScript если какой то сложный случай, например ajax.

Вот а если к тому моменту как пройдет твой тайм аут на поиск элемента он ЕЩЕ не появится, а как пройдет тайм аут как раз и выглянет :smile: и потом будет висеть некоторое время блокируя дальнейший функционал :smile:

Я имел ввиду следующее:
Логинимся, видим некий фрейм в котором отображаются несколько вкладок (каждая содержит некоторое количество элементов).
Так вот, мне надо, после логина очищать это фрейм.
Слева есть меню, в нем кнопка “все”. При нажатии на неё, все объекты которые указаны в этом левом меню отображаются в основном фрейм, при повторном нажатии они скрываются.

Ой тогда я всех запутал… Ответ rmerkushin то что тебе нужно.

сделал так =)

не очень красиво, но работает )

def clear(self):
        while True:
            self.all.click()
            try:
                if self._wait.until_not(lambda driver: driver.find_element_by_xpath(xpath)):
                    break
            except:
                continue