Селектор кнопок Selenium и клик

Я хочу автоматизировать перезапуск своего маршрутизатора с помощью Selenium на Python. Все работает нормально, кроме последнего шага, который заключается в том, чтобы найти кнопку перезагрузки и нажать ее!

Я пытался найти его по (id, css_selector, name, value, xpath), но ничего не помогло.

Вот мой код:

driver = webdriver.Firefox()
driver.get('http://192.168.100.1')

english = driver.find_element_by_id("English")
english.click()

usr = "username"
pwd = "password"

usrname_box = driver.find_element_by_id("txt_Username")
usrname_box.send_keys(usr)

pwd_box = driver.find_element_by_id("txt_Password")
pwd_box.send_keys(pwd)

submit_ = driver.find_element_by_id("button")
submit_.click()
sleep(1)


resetit = driver.find_element_by_name("maindiv_reset")
resetit.click()
sleep(1)

# This is the one I want to locate
reboot = driver.find_element_by_xpath("//input[@id='btnReboot']")
reboot.click()

А это HTML-код целевой кнопки:

<input class = "ApplyButtoncss buttonwidth_150px" name = "btnReboot" id = "btnReboot" type = "button" onclick = "Reboot()" bindtext = "s0603" value = "Restart">

При попытке что-либо я получаю сообщение об ошибке:

NoSuchElementException: Message: Unable to locate element: (WHATEVER I TRY)

Скриншот HTML-страницы:

Селектор кнопок Selenium и клик

Спасибо всем за вашу помощь заранее.

Кнопка "Roboot" появляется после нажатия кнопки "Reset"?

Greg Burghardt 30.05.2019 16:09

Да, он отображается, и я могу щелкнуть его вручную, но код Python не может его достичь.

SoulSA 30.05.2019 16:23

Это не совсем то, что я спросил. Если кнопка «Перезагрузка» появляется динамически после при нажатии кнопки «Сброс», это может повлиять на решение вашей проблемы.

Greg Burghardt 30.05.2019 17:29

Он появляется сразу после нажатия на вкладку System Tools, которая есть resetit в коде.

SoulSA 30.05.2019 19:05
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
4
846
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Твой этот:

reboot = driver.find_element_by_name("btnReboot")
reboot.click()

Та же проблема: NoSuchElementException: Message: Unable to locate element: [name = "btnReboot"]

SoulSA 30.05.2019 16:17

попробуйте использовать: resetit = driver.find_element_by_class("ApplyButtoncss buttonwidth_150px") или resetit = driver.find_element_by_class_name("ApplyButtoncss buttonwidth_150px")

Manuel 30.05.2019 16:22

Было бы проще, если бы веб-сайт был общедоступным, и мы могли бы попробовать скрипт сами, но попробуйте этот: driver.execute_script("Reboot()")

Manuel 30.05.2019 17:07

Я попробовал, это дало мне JavascriptException: Message: ReferenceError: Reboot is not defined

SoulSA 30.05.2019 19:10

В качестве последнего решения вы можете указать Python нажать кнопку «Перезапустить», предполагая, что вы можете найти координаты пикселя (X, Y) на экране и предполагая, что браузер Firefox не смещается при запуске скрипта. См. здесь.

Ответ принят как подходящий

Желаемый элемент — это элемент с поддержкой JavaScript, поэтому, чтобы найти и click() на элементе, вы должны вызвать WebDriverWait для элемент, который будет кликабельным, и вы можете использовать любой из следующих Стратегии поиска:

  • Использование CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.ApplyButtoncss.buttonwidth_150px#btnReboot[value='Restart']"))).click()
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='ApplyButtoncss buttonwidth_150px' and @id='btnReboot'][@value='Restart']"))).click()
    
  • Примечание: Вы должны добавить следующие импорты:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

Подозреваю, что это правильный ответ. Звучит как состояние гонки между селеном и JavaScript.

Greg Burghardt 30.05.2019 17:30

Код выдал ошибку: TimeoutException: Message: для обоих (селектор CSS и XPath). Это занимает некоторое время, прежде чем столкнуться с этой ошибкой.

SoulSA 30.05.2019 19:01

Могу ли я выполнить код javascript (получил его из файла javascript кнопки) с помощью driver.execute_script(javascript), когда я попробовал, он выдал мне сообщение об ошибке JavascriptException: Message: SyntaxError: expected expression, got ')', и я не уверен, правильно ли я делаю!?

SoulSA 30.05.2019 20:25

@SoulSA Конечно, у нас есть вариант execute_script(), но это должно быть последним средством. Однако Исключение тайм-аута является результатом не удалосьОжидаемые условия. Можете ли вы отладить свой код с помощью find_element_by_* в сочетании с time.sleep(), и если вы сможете найти элемент, обновить вопрос с наблюдениями? Кроме того, проверьте, находится ли элемент внутри тега <iframe>.

undetected Selenium 30.05.2019 21:28

@DebanjanB Я решил проблему благодаря вашему ответу. Спасибо.

SoulSA 30.05.2019 22:06

Поскольку целевая кнопка была включена в iframe, я использовал следующий метод для решения проблемы:

iframe = driver.find_element_by_id("frameContent")
driver.switch_to.frame(iframe)
driver.find_element_by_id('btnReboot').click()
alert = driver.switch_to_alert()
alert.accept()

Большое спасибо всем, кто пытался помочь, особенно ДебанджанБ

Другие вопросы по теме