Какие selenium.webdriver.support.expected_conditions
лучше использовать в ожидании невидимости элемента?
В моем случае я ввожу данные в форму, нажимаю сохранить и жду когда загрузчик исчезнет
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((SelectBy.CSS_SELECTOR, ".spinner")))
debug("loader appeared")
wait.until(EC.invisibility_of_element_located((SelectBy.CSS_SELECTOR, ".spinner")))
debug("loader disappeared")
В выводе я вижу, что второе ожидание выполняется в течение 20 секунд (мое глобальное неявное ожидание составляет 20 секунд).
360ms ⟥ [debug] loader appeared
21s 141ms ⟥ [debug] loader disappeared
Локатор хороший, пытаюсь понять, что не так с ожиданием. Были ли у кого-нибудь подобные проблемы? Буду рад любым предложениям.
Из документации Ожидания
Предупреждение: не смешивайте неявные и явные ожидания. Это может привести к непредсказуемому времени ожидания. Например, установка неявного ожидания в 10 секунд и явного ожидания в 15 секунд может привести к тайм-ауту через 20 секунд.
Возможно смешивание следующих двух ожиданий:
вызывает непредсказуемое время ожидания.
При вызове WebDriverWait вам необходимо перенастроить неявное ожидание на 0
, используя следующую строку кода:
Питон:
driver.implicitly_wait(0)
Джава:
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
Дотнет:
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(0);
Спасибо за полезный совет
Ваши операции ожидания накладываются друг на друга, потому что ваш код связан.
Позвольте мне объяснить с вашим кодом:
# 1. create a wait object
wait = WebDriverWait(driver, 10)
# 2. execute a wait statement
wait.until(EC.presence_of_element_located((SelectBy.CSS_SELECTOR, ".spinner")))
debug("loader appeared")
# 3. execute a wait statement
wait.until(EC.invisibility_of_element_located((SelectBy.CSS_SELECTOR, ".spinner")))
debug("loader disappeared")
Оба оператора ожидания (№2 и №3) используют один и тот же объект ожидания, поэтому их выполнение будет "стекаться":
Действие № 2 ждет 10 секунд. Действие №3 ждет 20 секунд.
Спасибо, я нашел это как одно из решений для ожидания исчезновения объекта на этом сайте. "wait.until(EC.presence_of_element_located((SelectBy.CSS_SELECTOR, ".spinner"))) debug("появился загрузчик")" - это ожидание проходит без проблем, но .invisibility_of_element_located зависает.
Из документации Explicit Waits
Вы также можете попробовать это:
try:
WebDriverWait(driver, 10).until(
EC.invisibility_of_element_located((By.CSS_SELECTOR, ".spinner"))
)
finally:
debug('loader disappeared')
В приведенном выше коде Selenium будет ждать максимум 10 секунд, пока не будет найден элемент, соответствующий заданным критериям. Если за это время элемент не найден, генерируется исключение TimeoutException. По умолчанию WebDriverWait вызывает ExpectedCondition каждые 500 миллисекунд, пока не вернет успешное выполнение. ExpectedCondition вернет значение true (логическое значение) в случае успеха или значение null, если не удастся найти элемент.
Таким образом, моя проблема была решена, и я думаю, что это хорошая практика, когда вы не будете ждать больше установленного времени.
Я думаю ты прав. Я попытаюсь изменить неявное ожидание внутри моей функции.