В чем разница между некоторыми похожими ожиданиями селена?

#python #selenium #expected-condition

Вопрос:

Простой вопрос:

В чем точная разница между этими двумя утверждениями:

  1. WebDriverWait(self._driver, WEB_WAIT_TIMEOUT).until(ec.invisibility_of_element_located(element))

и

  1. 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, поэтому он сначала дождется видимости, а затем невидимости.