Selenium WebDriver: проблема с тайм-аутом щелчка по элементам и раскрывающимся спискам ⇐ Python
Selenium WebDriver: проблема с тайм-аутом щелчка по элементам и раскрывающимся спискам
Сейчас я работаю над проектом парсинга веб-страниц с использованием Selenium WebDriver в Python. Первоначально код работал так, как и ожидалось, но когда я ввел функции для упрощения и модульности кода, я начал сталкиваться с проблемами, связанными с тайм-аутом элементов и их невозможностью кликнуть.
Конкретная проблема возникает при попытке щелкнуть элементы с помощью функции click_element и выбрать параметры раскрывающегося списка с помощью функции select_dropdown_option. Эти функции используют WebDriverWait для видимости элемента и возможности нажатия на него.
Я заметил, что без функций код работает нормально. Однако, как только я ввожу эти функции, чтобы сделать код более удобным в обслуживании и читабельности, элементы не находятся в пределах указанного тайм-аута, что приводит к ошибкам TimeoutException.
Я пробовал различные решения, включая увеличение времени ожидания, ожидание различных условий и прокрутку элементов перед нажатием. Несмотря на эти попытки, проблема остается.
На веб-сайте, к которому я захожу, есть анкета, предназначенная для обработки различных комбинаций ответов пользователей. По завершении он вычисляет числовое значение, которое я пытаюсь сохранить в кадре данных Pandas.
Я был бы признателен за любую помощь в понимании того, почему введение функций влияет на поведение взаимодействий Selenium WebDriver. Мы будем очень признательны за любые идеи или предложения о том, как решить эту проблему.
Оригинальный код, который работает без проблем:
из веб-драйвера импорта селена из selenium.webdriver.support.ui импортировать WebDriverWait из selenium.webdriver.support импортируйте ожидаемые_условия как EC из selenium.webdriver.common.by импортировать из selenium.webdriver.common.keys импортировать ключи из selenium.webdriver.common.action_chains импортировать ActionChains время импорта импортировать панд как pd # Создаем пустой DataFrame df = pd.DataFrame(columns=['var1', 'var2', 'бюджет']) # Определить списки для взаимодействий право = ['Да', 'Нет'] уровень = ['Термин1', 'Термин2', 'Термин3'] # Варианты навигации параметры = веб-драйвер.ChromeOptions() options.add_argument('--start-maximized') options.add_argument('--disable-extensions') driver_path = 'C:\\Users\\...\\chromedriver.exe' драйвер = webdriver.Chrome(driver_path, chrome_options=options) driver.get('https://example.com') #Авторизоваться:----------------------------------------------- ------------------------ WebDriverWait(драйвер, 5) \ .until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'input#username'))) \ .send_keys('example@mail.com') WebDriverWait(драйвер, 5) \ .until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'input#password'))) \ .send_keys('1234') WebDriverWait(драйвер, 5) \ .until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.login_button_example'.replace(' ','.')))) \ .клик() #Прокрутите вопросы:-------------------------------------------- ------ для ответа в правомочном: за срок на уровне: если ответ == 'Да': WebDriverWait(драйвер, 5)\ .until(EC.element_to_be_clickable((By.XPATH, '/html/...да../span[1]'))) \ .клик() еще: #Нет WebDriverWait(драйвер, 5)\ .until(EC.element_to_be_clickable((By.XPATH, '/html/...нет.../span[1]'))) \ .клик() # Найдите поле ввода, связанное с раскрывающимся списком. #Поддержание и уборка дома – уровень независимости: WebDriverWait(драйвер, 5)\ .until(EC.element_to_be_clickable(((По.ID, "select2-...-контейнер"))))\ .клик() item_to_select = driver.find_element(By.XPATH, f"//li[text()='{term}']") item_to_select.click() #Переходим на вкладку расчета WebDriverWait(драйвер, 5)\ .until(EC.element_to_be_clickable((By.XPATH, '/html/.../button[2]'))) \ .клик() #Нажимаем «пересчитать» WebDriverWait(драйвер, 5)\ .until(EC.element_to_be_clickable((By.XPATH, '/html/.../кнопка'))) \ .клик() # Подождите, пока элемент появится в DOM Budget_element = WebDriverWait(драйвер, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "бюджет")) ) # Получаем текстовое содержимое элемента бюджет_текст = бюджет_элемент.текст df = df.append({'var1': ответ, 'var2': термин, 'бюджет': Budget_text}, ignore_index=True) #Вернёмся на вкладку формы WebDriverWait(драйвер, 5)\ .until(EC.element_to_be_clickable((By.XPATH, '/html/.../button[1]'))) \ .клик() # Закрываем браузер драйвер.выйти() # Распечатываем окончательный DataFrame печать (дф) Модульная версия кода, отображающая исключение TimeoutException:
из веб-драйвера импорта селена из selenium.webdriver.common.by импортировать из selenium.webdriver.support.ui импортировать WebDriverWait из selenium.webdriver.support импортируйте ожидаемые_условия как EC импортировать панд как pd #Функция для входа в мою учетную запись. def логин (имя пользователя, пароль): WebDriverWait(драйвер, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'input#username'))).send_keys(имя пользователя) WebDriverWait(драйвер, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'input#password'))).send_keys(пароль) WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.login_button_example'))).click() #Функция для кликабельных элементов защита click_element (xpath): WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, xpath))).click() #Функция для выбора опций раскрывающегося списка def select_dropdown_option(dropdown_id, term): click_element(f"//label[@for='{dropdown_id}']") item_to_select = driver.find_element(By.XPATH, f"//li[text()='{term}']") item_to_select.click() #Функция перерасчета бюджета для каждой итерации защита recalculate_budget(): click_element("/html/.../button[2]") click_element("/html/.../button") #Функция возврата к анкете защита move_to_form_tab(): click_element("/html/.../button[1]") #Параметры навигации параметры = веб-драйвер.ChromeOptions() options.add_argument('--start-maximized') options.add_argument('--disable-extensions') driver_path = 'C:\\Users\\...\\chromedriver.exe' драйвер = webdriver.Chrome(driver_path, chrome_options=options) # Создаем пустой DataFrame df = pd.DataFrame(columns=['var1', 'var2', 'бюджет']) # Вход на сайт логин('example@gmail.com', '1234') # Определите списки для вашего взаимодействия право = ['Да', 'Нет'] уровень = ['Термин1', 'Термин2', 'Термин3'] для ответа в правомочном: за срок на уровне: если ответ == 'Да': click_element('/html/.../span[1]') #xPath к кнопке "да" еще: click_element('/html/.../span[1]') #xPath к кнопке «нет» select_dropdown_option("select2-...-container", term) recalculate_budget() # Подождите, пока элемент появится в DOM Budget_element = WebDriverWait(драйвер, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "бюджет")) ) # Получаем текстовое содержимое элемента бюджет_текст = бюджет_элемент.текст df = df.append({'var1': ответ, 'var2': термин, 'бюджет': Budget_text}, ignore_index=True) move_to_form_tab() # Закрываем браузер драйвер.выйти() # Распечатываем окончательный DataFrame печать (дф)
Сейчас я работаю над проектом парсинга веб-страниц с использованием Selenium WebDriver в Python. Первоначально код работал так, как и ожидалось, но когда я ввел функции для упрощения и модульности кода, я начал сталкиваться с проблемами, связанными с тайм-аутом элементов и их невозможностью кликнуть.
Конкретная проблема возникает при попытке щелкнуть элементы с помощью функции click_element и выбрать параметры раскрывающегося списка с помощью функции select_dropdown_option. Эти функции используют WebDriverWait для видимости элемента и возможности нажатия на него.
Я заметил, что без функций код работает нормально. Однако, как только я ввожу эти функции, чтобы сделать код более удобным в обслуживании и читабельности, элементы не находятся в пределах указанного тайм-аута, что приводит к ошибкам TimeoutException.
Я пробовал различные решения, включая увеличение времени ожидания, ожидание различных условий и прокрутку элементов перед нажатием. Несмотря на эти попытки, проблема остается.
На веб-сайте, к которому я захожу, есть анкета, предназначенная для обработки различных комбинаций ответов пользователей. По завершении он вычисляет числовое значение, которое я пытаюсь сохранить в кадре данных Pandas.
Я был бы признателен за любую помощь в понимании того, почему введение функций влияет на поведение взаимодействий Selenium WebDriver. Мы будем очень признательны за любые идеи или предложения о том, как решить эту проблему.
Оригинальный код, который работает без проблем:
из веб-драйвера импорта селена из selenium.webdriver.support.ui импортировать WebDriverWait из selenium.webdriver.support импортируйте ожидаемые_условия как EC из selenium.webdriver.common.by импортировать из selenium.webdriver.common.keys импортировать ключи из selenium.webdriver.common.action_chains импортировать ActionChains время импорта импортировать панд как pd # Создаем пустой DataFrame df = pd.DataFrame(columns=['var1', 'var2', 'бюджет']) # Определить списки для взаимодействий право = ['Да', 'Нет'] уровень = ['Термин1', 'Термин2', 'Термин3'] # Варианты навигации параметры = веб-драйвер.ChromeOptions() options.add_argument('--start-maximized') options.add_argument('--disable-extensions') driver_path = 'C:\\Users\\...\\chromedriver.exe' драйвер = webdriver.Chrome(driver_path, chrome_options=options) driver.get('https://example.com') #Авторизоваться:----------------------------------------------- ------------------------ WebDriverWait(драйвер, 5) \ .until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'input#username'))) \ .send_keys('example@mail.com') WebDriverWait(драйвер, 5) \ .until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'input#password'))) \ .send_keys('1234') WebDriverWait(драйвер, 5) \ .until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.login_button_example'.replace(' ','.')))) \ .клик() #Прокрутите вопросы:-------------------------------------------- ------ для ответа в правомочном: за срок на уровне: если ответ == 'Да': WebDriverWait(драйвер, 5)\ .until(EC.element_to_be_clickable((By.XPATH, '/html/...да../span[1]'))) \ .клик() еще: #Нет WebDriverWait(драйвер, 5)\ .until(EC.element_to_be_clickable((By.XPATH, '/html/...нет.../span[1]'))) \ .клик() # Найдите поле ввода, связанное с раскрывающимся списком. #Поддержание и уборка дома – уровень независимости: WebDriverWait(драйвер, 5)\ .until(EC.element_to_be_clickable(((По.ID, "select2-...-контейнер"))))\ .клик() item_to_select = driver.find_element(By.XPATH, f"//li[text()='{term}']") item_to_select.click() #Переходим на вкладку расчета WebDriverWait(драйвер, 5)\ .until(EC.element_to_be_clickable((By.XPATH, '/html/.../button[2]'))) \ .клик() #Нажимаем «пересчитать» WebDriverWait(драйвер, 5)\ .until(EC.element_to_be_clickable((By.XPATH, '/html/.../кнопка'))) \ .клик() # Подождите, пока элемент появится в DOM Budget_element = WebDriverWait(драйвер, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "бюджет")) ) # Получаем текстовое содержимое элемента бюджет_текст = бюджет_элемент.текст df = df.append({'var1': ответ, 'var2': термин, 'бюджет': Budget_text}, ignore_index=True) #Вернёмся на вкладку формы WebDriverWait(драйвер, 5)\ .until(EC.element_to_be_clickable((By.XPATH, '/html/.../button[1]'))) \ .клик() # Закрываем браузер драйвер.выйти() # Распечатываем окончательный DataFrame печать (дф) Модульная версия кода, отображающая исключение TimeoutException:
из веб-драйвера импорта селена из selenium.webdriver.common.by импортировать из selenium.webdriver.support.ui импортировать WebDriverWait из selenium.webdriver.support импортируйте ожидаемые_условия как EC импортировать панд как pd #Функция для входа в мою учетную запись. def логин (имя пользователя, пароль): WebDriverWait(драйвер, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'input#username'))).send_keys(имя пользователя) WebDriverWait(драйвер, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'input#password'))).send_keys(пароль) WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.login_button_example'))).click() #Функция для кликабельных элементов защита click_element (xpath): WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, xpath))).click() #Функция для выбора опций раскрывающегося списка def select_dropdown_option(dropdown_id, term): click_element(f"//label[@for='{dropdown_id}']") item_to_select = driver.find_element(By.XPATH, f"//li[text()='{term}']") item_to_select.click() #Функция перерасчета бюджета для каждой итерации защита recalculate_budget(): click_element("/html/.../button[2]") click_element("/html/.../button") #Функция возврата к анкете защита move_to_form_tab(): click_element("/html/.../button[1]") #Параметры навигации параметры = веб-драйвер.ChromeOptions() options.add_argument('--start-maximized') options.add_argument('--disable-extensions') driver_path = 'C:\\Users\\...\\chromedriver.exe' драйвер = webdriver.Chrome(driver_path, chrome_options=options) # Создаем пустой DataFrame df = pd.DataFrame(columns=['var1', 'var2', 'бюджет']) # Вход на сайт логин('example@gmail.com', '1234') # Определите списки для вашего взаимодействия право = ['Да', 'Нет'] уровень = ['Термин1', 'Термин2', 'Термин3'] для ответа в правомочном: за срок на уровне: если ответ == 'Да': click_element('/html/.../span[1]') #xPath к кнопке "да" еще: click_element('/html/.../span[1]') #xPath к кнопке «нет» select_dropdown_option("select2-...-container", term) recalculate_budget() # Подождите, пока элемент появится в DOM Budget_element = WebDriverWait(драйвер, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "бюджет")) ) # Получаем текстовое содержимое элемента бюджет_текст = бюджет_элемент.текст df = df.append({'var1': ответ, 'var2': термин, 'бюджет': Budget_text}, ignore_index=True) move_to_form_tab() # Закрываем браузер драйвер.выйти() # Распечатываем окончательный DataFrame печать (дф)
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение