#python #selenium #selenium-webdriver #selenium-chromedriver #browser-automation
#питон #селен #selenium-веб-драйвер #селен-хромовый преобразователь #автоматизация браузера
Вопрос:
На следующем веб-сайте https://icem.data-archive.ac.uk/#step1 Для разных округов мне нужно будет выбрать все переменные HISCO Occupation, что означает нажатие кнопки «Дополнительные переменные» и установление каждого поля на каждой странице. Количество страниц этих профессий HISCO является переменным и зависит от округа.
То, что я сделал до сих пор, — это код в следующем формате, устанавливающий каждое поле, а затем нажимающий на следующую страницу, для максимального количества страниц (20 страниц):
webD.find_element_by_xpath('/html/body/div[3]/div/div/div[3]/div[1]/label/input').click()
webD.find_element_by_xpath('/html/body/div[3]/div/div/div[3]/div[2]/label/input').click()
webD.find_element_by_xpath('/html/body/div[3]/div/div/div[3]/div[3]/label/input').click()
webD.find_element_by_xpath('/html/body/div[3]/div/div/div[3]/div[4]/label/input').click()
webD.find_element_by_xpath('/html/body/div[3]/div/div/div[3]/div[5]/label/input').click()
webD.find_element_by_xpath('/html/body/div[3]/div/div/div[3]/div[6]/label/input').click()
webD.find_element_by_xpath('/html/body/div[3]/div/div/div[3]/div[7]/label/input').click()
webD.find_element_by_xpath('/html/body/div[3]/div/div/div[3]/div[8]/label/input').click()
webD.find_element_by_xpath('/html/body/div[3]/div/div/div[3]/div[9]/label/input').click()
webD.find_element_by_xpath('/html/body/div[3]/div/div/div[3]/div[10]/label/input').click()
webD.find_element_by_xpath('/html/body/div[3]/div/div/div[4]/div/div[1]/ul/li[9]/a').click()
Когда я пытаюсь запустить это на примере только с 17 страницами, проверка каждого поля и перелистывание страниц работает отлично. Моя проблема заключается в нажатии кнопки «Применить».
В более раннем коде при выборе только одного занятия HISCO следующий код работал при нажатии кнопки Применить:
WebDriverWait(webD, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[contains(.,'Apply')]"))).click()
Эта же команда не работает в этом параметре. Это работает только в том случае, если в моем коде отмечены точно настроенные флажки (если у меня 17 страниц, мой код должен занимать только 17 страниц), никаких дополнительных. Поскольку я должен делать это для каждого года и каждого округа, я не могу адаптировать код и нуждаюсь в общей стратегии для решения этой проблемы.
Как всегда, спасибо всем, кто мне помогает!!
IDLE Отправляет это сообщение:
Traceback (most recent call last):
File "C:/Users/jessi/Desktop/Selenium/RA_TASK1_ALL_HISCO_CHECKED.py", line 326, in <module>
webD.find_element_by_xpath('/html/body/div[3]/div/div/div[3]/div[6]/label/input').click()
File "C:Usersjessilibsite-packagesseleniumwebdriverremotewebdriver.py", line 394, in find_element_by_xpath
return self.find_element(by=By.XPATH, value=xpath)
File "C:Usersjessilibsite-packagesseleniumwebdriverremotewebdriver.py", line 976, in find_element
return self.execute(Command.FIND_ELEMENT, {
File "C:Usersjessilibsite-packagesseleniumwebdriverremotewebdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:Usersjessilibsite-packagesseleniumwebdriverremoteerrorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div[3]/div/div/div[3]/div[6]/label/input"}
(Session info: chrome=88.0.4324.104)
Комментарии:
1. Это звучит как проблема X-Y. Вместо того, чтобы просить помощи в решении проблемы, отредактируйте свой вопрос и спросите о реальной проблеме. Что ты пытаешься сделать?
2. @DebanjanB Редактировать: мне нужно поставить галочки во всех полях переменной HISCO, но количество этих полей и страниц варьируется в зависимости от выбранного мной округа. Код, который у меня есть прямо сейчас, работает отлично, только если он содержит точное количество страниц / полей для пометки. Поскольку существует много разных округов, я не могу иметь индивидуальный код для каждой ситуации. Мне бы хотелось получить представление о том, как решить эту проблему… Зацикливание кажется очень сложным, так как в нем 200 строк…
Ответ №1:
Если вы хотите выбрать несколько похожих элементов, попробуйте find_elements_by_xpath
.
webD.find_elements_by_xpath('/html/body/div[3]/div/div/div//label/input')
вернет список всех входных элементов, которые вы хотите щелкнуть, независимо от того, сколько их в списке. Затем вы можете щелкнуть их все в for
цикле.
Возможно, вы захотите использовать лучшие xpath
выражения, например '//div[@class="modal-body ng-scope"]//input[@type="checkbox"]'
Итак, по сути, вы хотите что-то подобное на каждой странице:
input_elements = webD.find_elements_by_xpath('//div[@class="modal-body ng-scope"]//input[@type="checkbox"]')
for elem in input_elements:
elem.click()
Комментарии:
1. Правильно! В этом так много смысла! Спасибо за совет. Как ни странно, ни xpath в форме входных элементов не устанавливает флажки…
2. Да, действительно, ваше предложение имеет большой смысл, и я вижу, насколько оно более эффективно. Однако он не устанавливает флажки, и я попытался немного повозиться … не могу понять, почему это не так до сих пор. Спасибо за помощь
3. Мне жаль слышать, что проверка не состоялась.
input_elements
должен быть список входных элементов, которые должны быть кликабельными и отмечаться галочками вкл / выкл.4. Не беспокойтесь, спасибо вам за вашу помощь и хороший совет.