Отследить исчезновение тега
Имеется такой код:
# Пока таблица находится на странице
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 шт):
Вот пример использования 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')
)
)
)