Я хочу автоматизировать перезапуск своего маршрутизатора с помощью 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-страницы:
Спасибо всем за вашу помощь заранее.
Да, он отображается, и я могу щелкнуть его вручную, но код Python не может его достичь.
Это не совсем то, что я спросил. Если кнопка «Перезагрузка» появляется динамически после при нажатии кнопки «Сброс», это может повлиять на решение вашей проблемы.
Он появляется сразу после нажатия на вкладку System Tools
, которая есть resetit
в коде.
Твой этот:
reboot = driver.find_element_by_name("btnReboot")
reboot.click()
Та же проблема: NoSuchElementException: Message: Unable to locate element: [name = "btnReboot"]
попробуйте использовать: resetit = driver.find_element_by_class("ApplyButtoncss buttonwidth_150px") или resetit = driver.find_element_by_class_name("ApplyButtoncss buttonwidth_150px")
Было бы проще, если бы веб-сайт был общедоступным, и мы могли бы попробовать скрипт сами, но попробуйте этот: driver.execute_script("Reboot()")
Я попробовал, это дало мне JavascriptException: Message: ReferenceError: Reboot is not defined
В качестве последнего решения вы можете указать 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.
Код выдал ошибку: TimeoutException: Message:
для обоих (селектор CSS и XPath). Это занимает некоторое время, прежде чем столкнуться с этой ошибкой.
Могу ли я выполнить код javascript (получил его из файла javascript кнопки) с помощью driver.execute_script(javascript)
, когда я попробовал, он выдал мне сообщение об ошибке JavascriptException: Message: SyntaxError: expected expression, got ')'
, и я не уверен, правильно ли я делаю!?
@SoulSA Конечно, у нас есть вариант execute_script()
, но это должно быть последним средством. Однако Исключение тайм-аута является результатом не удалосьОжидаемые условия. Можете ли вы отладить свой код с помощью find_element_by_*
в сочетании с time.sleep()
, и если вы сможете найти элемент, обновить вопрос с наблюдениями? Кроме того, проверьте, находится ли элемент внутри тега <iframe>
.
@DebanjanB Я решил проблему благодаря вашему ответу. Спасибо.
Поскольку целевая кнопка была включена в 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()
Большое спасибо всем, кто пытался помочь, особенно ДебанджанБ
Кнопка "Roboot" появляется после нажатия кнопки "Reset"?