Сам себя перезагрузи

Есть одна небольшая проблема с моим роутером: при потере соединения с интернетом (со стороны провайдера) даже на небольшой промежуток времени, для подъема его приходится перезагружать. Т.е. заходить в панельку, вводить admin/pass, искать кнопочку “reboot”.

Наконец чисто из спортивного интереса пришла в голову мысль это все автоматизировать.

Просто сделать нужный POST запрос - это для слабаков (на самом деле роутер выпендиривался и ничего не принимал). Поэтому для решения данной задачи решил воспользоваться библиотекой Selenium WebDriver. Так как задача относится к разряду быстрофикс на коленке, то я использовал Python.

Для начала поставим библиотеку с помощью pip:

pip install selenium

В качестве драйвера будем использовать Chrome, который можно скачать тут.
Теперь приступим к коду:

import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--window-size=1920x1080")

chrome_driver = os.getcwd() + "\\chromedriver.exe"
driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=chrome_driver)

Импортируем библиотеки, задаем нужные опции для драйвера. В папке с исполняемым скриптом складываем только что скачанный chromedriver.exe.

Прежде чем попробовать зайти в панель управления роутером, нужно авторизоваться.

Авторизацию подобного типа можно пройти указывая данные прямо в ссылке, например: http://admin:pass@192.168.0.1/.

Теперь попробуем заставить наш скрипт зайти в панель управления:

driver.get("http://admin:pass@192.168.0.1/")
driver.get_screenshot_as_file("screenshot.png")

Последняя команда сохранит скриншот в папку с скриптом.
Теперь дело осталось за малым, надо заставить скрипт искать нужные кнопочки и дойти до меню с перезагрузкой. И тут мне пришлось повозиться. Вся страница состоит из фреймов, в которых selenium отказывался искать нужные мне кнопочки. Для того, чтобы его заставить, нужно переключить его на нужный фрейм:
# Кнопка System Tools в меню
driver.switch_to_frame("bottomLeftFrame")
button = driver.find_element_by_xpath("//a[text()='System Tools']")
button.click()

Отлично, теперь скрипт добрался до такого состояния:

Дойдем теперь до страницы перезагрузки, найдем кнопку и кликнем по ней:

# Кнопка Reboot в открывшемся меню
button = driver.find_element_by_xpath("//a[text()='- Reboot']")
button.click()

# Кнопка Reboot в открывшемся окне
driver.switch_to_default_content()
driver.switch_to_frame("mainFrame")
button = driver.find_element_by_xpath("//input[@value='Reboot']")
button.click()

Но для перезагрузки этого не достаточно.

Нам нужно подтвердить действие в таком вот диалоговом окне. Сделать это просто:

# Подтверждаем перезагрузку
driver.switch_to_alert().accept()

Готово! Роутер перезапускается. Подключение к интернету восстановлено.

Mission complete

Полный код:

import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--window-size=1920x1080")

chrome_driver = os.getcwd() + "\\chromedriver.exe"
driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=chrome_driver)
driver.get("http://admin:pass@192.168.0.1/")

# Кнопка System Tools в меню
driver.switch_to_frame("bottomLeftFrame")
button = driver.find_element_by_xpath("//a[text()='System Tools']")
button.click()

# Кнопка Reboot в открывшемся меню
button = driver.find_element_by_xpath("//a[text()='- Reboot']")
button.click()

# Кнопка Reboot в открывшемся окне
driver.switch_to_default_content()
driver.switch_to_frame("mainFrame")
button = driver.find_element_by_xpath("//input[@value='Reboot']")
button.click()

# Подтверждаем перезагрузку
driver.switch_to_alert().accept()

12.08.2018
Быстрофикс