#python #selenium #expected-condition
Вопрос:
Простой вопрос:
В чем точная разница между этими двумя утверждениями:
WebDriverWait(self._driver, WEB_WAIT_TIMEOUT).until(ec.invisibility_of_element_located(element))
и
WebDriverWait(self._driver, WEB_WAIT_TIMEOUT).until_not(ec.presence_of_element_located(element))
В обоих случаях поведение селена в моей ситуации одинаково. Заранее спасибо
Спасибо за ответы Хорошо, но есть еще вещи, которые я не понимаю: у меня есть базовая функция, которая проверяет, не виден ли спиннер.
`def wait_until_request_api_process_finished(self):
try:
WebDriverWait(self._driver, 1).until(ec.visibility_of_element_located(BaseLoc.spinner))
WebDriverWait(self._driver, 10).until(ec.invisibility_of_element_located(BaseLoc.spinner))
except TimeoutException:
pass
Но, даже если прядильщик не виден, селен ждет (примерно на 8 секунд больше, чем ожидалось). В чем проблема?
Комментарии:
1. Ну а в чем разница между
invisibility
(вы имели в видуvisibility_of_element_located
) иpresence
?2. Действительно, не заметил никаких различий между
3. Забудьте о Селене, прочитайте название функций на английском языке. Возможно, в вашем приложении нет разницы, но вы делаете разные вещи.
4. ut, даже если прядильщика не видно, селен ждет (примерно на 8 секунд больше, чем ожидалось). В чем проблема? — У вас в коде также есть неявные ожидания ?
5. Да, я установил неявное ожидание в 10 секунд. Должен ли я его удалить или, скорее, заменить?
Ответ №1:
У меня есть несколько вещей из официальных документов Selenium : здесь
Предупреждение:
Не смешивайте неявное и явное ожидания. Это может привести к непредсказуемому времени ожидания. Например, установка неявного ожидания в 10 секунд и явного ожидания в 15 секунд может привести к тайм-ауту через 20 секунд.
так что за ваш этот вопрос :
Но, даже если прядильщик не виден, селен ждет (примерно на 8 секунд больше, чем ожидалось). В чем проблема?
- да, это потому, что вы смешали их обоих. Перед удалением неявного ожидания (подумайте, что 8 секунд действительно имеют значение или важна большая надежность вашего набора тестов)
Теперь перейдем к этому вопросу :
invisibility_of_element_located
в основном смотрите эту внутреннюю реализацию :
private static boolean isInvisible(final WebElement element) {
try {
return !element.isDisplayed();
} catch (StaleElementReferenceException ignored) {
// We can assume a stale element isn't displayed.
return true;
}
}
так что это просто isDisplayed()
внутренняя проверка.
Ответ №2:
ec.invisibility_of_element_located
ждет невидимости элемента.
Элемент может существовать на странице, но быть невидимым.
Для такого элемента ec.invisibility_of_element_located
будет успешно возвращен True
, и ваш поток сценариев будет продолжаться, пока until_not(ec.presence_of_element_located(element))
не возникнет исключение тайм-аута, так как элемент все еще существует на странице.
Комментарии:
1. Итак, присутствие ищет элемент, который должен быть только в DOM?
2. Что вы подразумеваете под «только»? Да, он ищет присутствие элемента, буквально. На большинстве страниц много невидимых элементов.
Ответ №3:
Верхнее утверждение ожидает, пока (ec.invisibility_of_element_located(element))
не произойдет, было таким, как нижнее ожидало бы, пока (ec.presence_of_element_located(element))
не произойдет.
Примечание: функционально я знаю, что это не имеет смысла, но именно об этом меня спрашивают 🙂
Комментарии:
1. Как я понимаю, вы имеете в виду, что ожидание невидимости требует, чтобы элемент сначала был виден?
2. Я понимаю, что первый будет ждать, пока элемент не будет найден, а второй будет ждать, пока элемент не будет найден
3. Я отредактировал вопрос, чтобы подчеркнуть проблему
Ответ №4:
Ответ на вторую (добавленную) часть вопроса:
Возможно (и вероятно), что сценарий selenium проверяет невидимость до завершения загрузки страницы. У Селена нет возможности узнать, был ли элемент видимым раньше, а сейчас его нет в DOM, поэтому он сначала дождется видимости, а затем невидимости.