Как найти элемент на странице, не дожидаясь полной загрузки?

После нажатия определенной кнопки на странице происходит редирект, в результате чего возникает бесконечная загрузка, особенно учитывая, что интернет очень медленный. 

Как я могу находить элементы и инициировать клики во время этого процесса загрузки? Параметр driver.set_pageload_timeout() мне не подходит, поскольку кнопка может загружаться как за 10 секунд, так и за 60. Установка таймаута на 2 минуты кажется чрезмерной, так как при возникновении исключения браузер полностью останавливает загрузку страницы. При этом WebDriverWait срабатывает только после полной загрузки страницы.
  • 4 декабря 2024 г. 19:23
Ответы на вопрос 2
В условиях, когда загрузка страницы может затянуться и вы хотите взаимодействовать с элементами во время загрузки, можно рассмотреть несколько подходов. 

1. **Использование `execute_script`**: Вы можете использовать JavaScript для проверки наличия элемента. JavaScript выполняется независимо от загрузки страницы, и таким образом, вы сможете проверить, загружен ли нужный элемент.

   ```python
   from selenium import webdriver
   from selenium.common.exceptions import NoSuchElementException

   driver = webdriver.Chrome()

   # Нажимаем на кнопку, в результате которой происходит редирект
   button = driver.find_element(By.ID, "your_button_id")
   button.click()

   # Ждем, пока элемент появится или истечет время ожидания
   timeout = 20  # время ожидания в секундах
   start_time = time.time()

   while True:
       try:
           # Проверяем наличие элемента через JS
           element = driver.execute_script("return document.querySelector('your_selector') !== null;")
           if element:
               # Элемент найден, выполняем действие
               driver.find_element(By.CSS_SELECTOR, 'your_selector').click()
               break
       except NoSuchElementException:
           # Если элемент не найден, проверяем, не превышено ли время ожидания
           if time.time() - start_time > timeout:
               print("Timeout reached, element not found.")
               break
   ```

2. **Промежуточные ожидания**: Вместо 30-60 секундного таймаута, вы можете использовать более короткие таймауты с циклом ожидания. Это будет более гибкий вариант, так как не будет блокировать поток.

3. **Использование `find_elements`**: Метод `find_elements` не вызывает исключения, если элемент не найден, а возвращает пустой список. Таким образом, вы можете опрашивать элемент по частям, не дожидаясь полной загрузки.

   ```python
   while True:
       elements = driver.find_elements(By.CSS_SELECTOR, 'your_selector')
       if elements:
           # Ваш код, когда элемент найден
           elements[0].click()
           break
       # Вы можете добавлять небольшую паузу между итерациями
       time.sleep(0.5)  # ожидание в полсекунды
   ```

4. **Включение режима "интервал ожидания"**: Установка `driver.implicitly_wait()` не будет блокировать выполнение кода, но будет пытаться повторять поиск элемента в течение указанного времени.

Эти способы позволят вам находить и взаимодействовать с элементами на странице, не дожидаясь полной загрузки, что особенно полезно в случаях, когда загрузка страницы может длиться неопределенно долго.
options.page_load_strategy = 'none'
Похожие вопросы