Отследить исчезновение тега

Имеется такой код:

# Пока таблица находится на странице
while True:
  # Ищем таблицу
  if not driver.find_element_by_xpath('//*[@id="main-container"]/table'):
    # Если она пропала нажимаем на ссылку и выходим из цикла ожидания
    link = driver.find_element_by_link_text('Ссылка')
    link.click()
    break
  else:
    # Иначе ждем две секунды и проверяем снова, пропала таблица или нет
    time.sleep(2)

Хотел воспользоваться функцией WebDriverWait, но быстрее оказалось нагородить велосипед, чем разобраться. Проблема на данный момент в том, что когда таблица исчезает возникает ошибка:

Message: no such element: Unable to locate element:{"method":"xpath","selector":"//[@id="main-container"]/table"}*

Как безопасно проверить на наличие или отсутствие элемента на странице? И можно ли этот код преобразовать на основе WebDriverWait


Ответы (1 шт):

Автор решения: Roman Konoval

Вот пример использования WebDriverWait:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = ...

wait = WebDriverWait(driver, 10) # 10 секунд
wait.until(
    EC.visibility_of_element_located(
        (By.XPATH, '//*[@id="main-container"]/table')
    )
)

Этот код ждет что элемент видим. Если нужно проверить, что элемент невидим, то нужно воспользоваться другим условием, которое ждем (полный список в разделе Expected Conditions) - EC.invisibility_of_element_located.

Если же нужно проверить, что элемента вообще нет в дереве, то для этого случая нет стандартного условия и нужно создать свое. Можно создать условие отрицания и воспользоваться им вместе с EC.presence_of_all_elements_located:

class opposite_of(object):
  def __init__(self, condition):
    self.condition = condition
  def __call__(self, driver):
    return not self.condition(driver)


wait.until(
    opposite_of(
        EC.presence_of_all_elements_located(
            (By.XPATH, '//*[@id="main-container"]/table')
        )
    )
)

→ Ссылка