Как выбрать значение из выпадающего списка на странице с ожиданием?

Мне нужна помощь с использованием модуля time. Когда я раскомментирую строку time.sleep(5), код работает корректно: он выполняет клики и завершает выполнение без ошибок. Однако, если не использовать модуль time, код работает нестабильно, особенно при выборе города или при взаимодействии с третьим выпадающим списком. В результате возникает ошибка, которая гласит: <pre><code>Message: element click intercepted: Element &lt;li tabindex="-1" role="option" unselectable="on" class="k-item" aria-selected="false" data-offset-index="2"&gt;...&lt;/li&gt; is not clickable at point (482, 465). Other element would receive the click: &lt;li tabindex="-1" role="option" unselectable="on" class="k-item" aria-selected="false" data-offset-index="0"&gt;...&lt;/li&gt;</code></pre> <br/> Я кликаю на текстовые элементы (location, visa type, sub type), чтобы активировать выпадающий список, и затем пытаюсь проверить наличие нужного города или типа на странице. Есть фейковые формы, которые содержат такие же значения, поэтому я не использую select. <br/> Я пробовал вводить ожидания для проверки видимости и кликабельности элементов, но это не помогло: <br/> <pre><code class="python">WebDriverWait(driver, 5, poll_frequency=2).until(EC.any_of(EC.visibility_of_any_elements_located((By.XPATH, '//*[text()="Moscow"]')),EC.element_to_be_clickable((By.XPATH, '//*[text()="Moscow"]'))))
WebDriverWait(driver, 5, poll_frequency=2).until(EC.all_of(EC.visibility_of_any_elements_located((By.XPATH, '//*[text()="Schengen Visa"]')), EC.presence_of_all_elements_located((By.XPATH, '//*[text()="Schengen Visa"]'))))
WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, '//*[@class="k-animation-container"]/div/div/ul/li[text()="Tourism"
  • 17 января 2025 г. 8:24
Ответы на вопрос 1
Если ваш код работает корректно с использованием `time.sleep(5)`, это может значить, что веб-страница требует больше времени для загрузки элементов, чем вы ожидаете. Вместо использования `time.sleep()`, лучше использовать явные ожидания с `WebDriverWait`, которые могут подождать, пока элемент станет доступным для взаимодействия.

Вы можете использовать условия ожидания из `selenium.webdriver.support.expected_conditions` (псевдоним `EC`), чтобы убедиться, что элемент видим и кликаем. Если у вас возникают проблемы с тем, что элемент не кликается из-за того, что другой элемент перекрывает его, вы можете попробовать несколько подходов:

1. **Использовать `move_to_element`**: Это заставит курсор мыши переместиться на нужный элемент, в некоторых ситуациях это может помочь избежать перекрытия.

2. **Использовать JavaScript для клика**: Если обычный клик по элементу не работает, вы можете использовать JavaScript для выполнения клика.

3. **Проверка всех элементов**: Убедитесь, что все элементы, которые могут появляться на странице, не блокируют целевой элемент.

Ниже приведен пример кода, который использует `WebDriverWait`, `move_to_element`, и JavaScript для клика:

```python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()  # Убедитесь, что у вас установлен правильный драйвер.
driver.get('url_of_your_page')

try:
    # Клик на элемент для активации выпадающего списка
    location_dropdown = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, 'xpath_of_location_element'))
    )
    location_dropdown.click()

    # Дождаться появления элемента из выпадающего списка
    option = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.XPATH, '//*[text()="Moscow"]'))
    )

    # Прокрутка к элементу, чтобы избежать перекрытия
    actions = ActionChains(driver)
    actions.move_to_element(option).click().perform()  # Использование ActionChains для клика

    # Если обычный клик не дает результата:
    # driver.execute_script("arguments[0].click();", option)

except Exception as e:
    print(f'An error occurred: {e}')
finally:
    driver.quit()
```

В этом коде:
- Мы сначала ждем, пока выпадающий список станет кликабельным.
- Затем мы ждем видимости элемента, который мы хотим выбрать.
- Затем мы используем `ActionChains` для перемещения к элементу и кликаем его.
- Если это не сработает, можно попробовать выполнить клик через JavaScript.

Также, вы можете настроить параметры ожидания, увеличив время, если элементы на странице загружаются медленно. Это поможет справиться с нестабильностью, не прибегая к явному ожиданию через `time.sleep()`.
Похожие вопросы