Задать вопрос
@Fee1in

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

Прошу помощи, с модулем time (если раскомментировать строчку time.sleep(5)) код работает хорошо, везде кликает и завершается без ошибки. Как только не использовать модуль time так работает через раз, а именно стабильно валится либо на выборе города либо на третьем выпадающем списке, в сообщении об ошибке пишет следующее
Message: element click intercepted: Element <li tabindex="-1" role="option" unselectable="on" class="k-item" aria-selected="false" data-offset-index="2">...</li> is not clickable at point (482, 465). Other element would receive the click: <li tabindex="-1" role="option" unselectable="on" class="k-item" aria-selected="false" data-offset-index="0">...</li>

Кликаю именно на сами фразы (location, visa type, sub type) для активации выпадающего списка, и после ищу есть ли требуемый город/тип итд на странице, т.к есть на странице фейковые формы которые тоже содержат такие же значения. Из-за фейковых форм и не использовал select.
Пробовал вводить ожидания что элемент есть на странице и изображен и кликабелен - не помогает:
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"]')))
WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, '//*[@class="k-animation-container"]/div/div/ul/li[text()="Tourism"]')))

678a0f8c54640931469836.png
Стабильно крашится через раз в цикле: for element in driver.find_elements('xpath', '//label[@class and text()="Visa Sub Type"]'):
Подскажите пожалуйста где ошибка?
Тк с time все элементы подгрузились то не падает код, а без него похоже элементы продолжают грузиться и не все успевают подгрузиться, поэтому и падает скорее всего. Может какое-то ожидание еще добавить?
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import Select
import time

url = "C:\\Users\\User\\Downloads\\dropdown_example.html"

def get_chromedriver(use_proxy=False, user_agent=None):
    chrome_options = webdriver.ChromeOptions()
    prefs = {"detach": True,"excludeSwitches": ["enable-automation"],'useAutomationExtension': False, "credentials_enable_service": False, "profile.password_manager_enabled": False}
    chrome_options.add_experimental_option("prefs", prefs)
    driver = webdriver.Chrome(options=chrome_options)
    driver.implicitly_wait(10)
    return driver
def main():
    try:
        driver = get_chromedriver(use_proxy=False, user_agent='Mozilla/5.0 (Wayland like X11; Debian; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.6635.179 Safari/537.36')
        driver.get(url)
        wait = WebDriverWait(driver, 10)
        book_app(driver,wait)
        driver.quit()
    except Exception as e:
        print(e)

def book_app(driver, wait):
    url_book=driver.current_url
    driver.get(url_book)
    # time.sleep(5)
    # Ищем элементы с данным xpath, тк на странице существуют точно такие же фейковые формы
    elements = driver.find_elements('xpath', '//span[@class and @aria-selected="true"]')

    for element in elements:
        #Проверяем есть ли данная форма на страничке
        if element.is_displayed():
            #Активация списка городов по щелчку
            # dropdown = Select(driver.find_element('xpath', '//*[@id="q5b9736e-4bb8-4468-afe5-48863c3d8e92"]'))
            # dropdown.click()
            # dropdown.select_by_visible_text('Moscow')
            element.click()
            #После появления выпадающего списка в страницу подгружается список городов
            print('Активировали Location')
            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"]'))))
            for i in driver.find_elements('xpath', '//*[text()="Moscow"]'):
                if i.is_displayed():
                    i.click()
                    print('Нажали на нужный город')
                    break
            # Попробовать Select метод для выпадающего списка, но не работает
            # driver.find_elements('xpath', '//*[text()="Moscow"]').click()
            # select = Select(WebDriverWait(driver,5, poll_frequency=2).until(EC.element_to_be_clickable((By.XPATH,'//*[text()="Moscow"]'))))
            # select.select_by_visible_text('Moscow')
            break
    for element in driver.find_elements('xpath', '//label[@class and text()="Visa Type"]'):
        if element.is_displayed():
            element.click()
            # time.sleep(2)
            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"]'))))
            for i in driver.find_elements('xpath', '//*[text()="Schengen Visa"]'):
                if i.is_displayed():
                    i.click()
                    print('Нажали на Visa Type')
                    break
            break
    for element in driver.find_elements('xpath', '//label[@class and text()="Visa Sub Type"]'):
        if element.is_displayed():
            element.click()
            WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, '//*[@class="k-animation-container"]/div/div/ul/li[text()="Tourism"]')))
            for i in driver.find_elements('xpath', '//*[@class="k-animation-container"]/div/div/ul/li[text()="Tourism"]'):
                if i.is_displayed():
                    WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, '//*[@class="k-animation-container"]/div/div/ul/li[text()="Tourism"]')))
                    i.click()
                    print('Нажали на Sub Type')
                    break
            break
    for element in driver.find_elements('xpath', '//label[@class and text()="Category"]'):
        if element.is_displayed():
            element.click()
            WebDriverWait(driver, 5, poll_frequency=2).until(EC.all_of(EC.visibility_of_any_elements_located((By.XPATH, '//*[text()="Normal"]')), EC.element_to_be_clickable((By.XPATH, '//*[text()="Normal"]'))))
            for i in driver.find_elements('xpath', '//*[text()="Normal"]'):
                if i.is_displayed():
                    i.click()
                    print('Нажали на Category')
                    break
            break
    return


if __name__ == '__main__':
    main()
  • Вопрос задан
  • 44 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы