Автоматизация любых действий в браузере с помощью PowerShell и Selenium
Для автоматизации различных действий в браузере из скриптов PowerShell можно использовать фреймворк Selenium. С помощью Selenium вы можете получить содержимое веб страницы так, как его видит пользователь (отрабатываются все скрипты Java, стили, куки) Чаще всего Selenium используется для тестирования веб-сайтов с имитацией действий реального пользователя, но также он может быть полезным инструментом системного администратора для автоматизации действий и получения данных из веб-приложений и панелей управления. Например, с помощью Selenium вы можете автоматически выполнить любые действий в произвольном веб-интерфейсе администрирования, для которого отсутствует открытый доступ через API или веб хуки. Выполнить автоматический вход в веб интерфейс приложения, переходить по ссылкам, щёлкать по элементам или кнопкам в панели управления, заполнять и отправлять данные в формах, имитировать движение мыши, делать скриншоты веб страницы – все этом возможно с помощью Selenium.
В этой статье мы рассмотрим, как системный администратор Windows может использовать возможности фреймворка Selenium в скриптах PowerShell (статья предназначена для администраторов, далеких от веб программирования).
Установка библиотеки и драйвера Selenium для браузера
Для использования Selenium в скриптах PowerShell на компьютер нужно скопировать два файла:
- Библиотеку Selenium (файл Webdriver.dll). Проще всего скачать NuGet архив с пакетом Selenium отсюда (https://www.nuget.org/packages/Selenium.WebDriver) и извлечь файл Webdriver.dll из папки
selenium.webdriver.4.21.0.nupkglibnetstandard2.0
с помощью 7Zip - Скачайте драйвер для браузера, в котором вы будете обращаться к сайтам из Selenium. Доступны драйвера для браузеров Firefox, Opera, Edge, Safari. В моем примере я буду использовать драйвер для Google Chrome. Скачайте драйвер для своей версии Google Chrome здесь (версия драйвера и браузера на компьютере должны совпадать). Поместите файл chromedriver.exe в каталог с библиотекой (не забудьте разблокировать скачанный из интернета исполняемый файл).
Взаимодействие с браузером из скрипта PowerShell через библиотеку Selenium
Рассмотрим небольшой пример доступа к вебсайту из скрипта PowerShell, эмуляции нажатий на кнопки и получение данных с веб страницы с помощью Selenium. Наша задача — измерить скорость интернет-подключения провайдера с помощью популярного веб-сервиса https://www.speedtest.net/. Пользователю для проверки скорости на Speedtest нужно нажать кнопку и дождаться результатов. В нашем примере мы будем эмулировать нажатие кнопки в браузере и получим результаты тестирования со страницы в наш скрипт.
Добавляем путь к каталогу Selenium в переменные окружения текущей сессии PowerShell:
$selenium_path = 'C:PSselenium'
$env:Path += ";$selenium_path"
Импорт библиотеки Selenium:
Import-Module "$selenium_pathWebDriver.dll"
Создать объект браузера и перейти на указанный URL:
$selenium = New-Object OpenQA.Selenium.Chrome.ChromeDriver -ArgumentList $selenium_path
$selenium.Navigate().GoToURL(https://www.speedtest.net/')
Чтобы нажать кнопку Go на сайте из кода PowerShell скрипта, нужно найти соответствующий элемент на странице. Для идентификации элементов веб страницы я предпочитаю использовать Xpath (для меня это более понятный способ, веб программисты скорее всего будут использовать что-то другое).
В браузере щелкните по элементу, чей Xpath вы хотите узнать и выберите Inspect. Откроется окно с инструментами разработчика Chrome. Ваш элемент интерфейса будет подсвечен в консоли инспектора HTML кода. Выберите Copy -> Copy XPath.
Чтобы найти HTML элемент на веб странице по XPath, используется команда:
$selenium.FindElement([OpenQA.Selenium.By]::XPath('ваш XPATH'))
[OpenQA.Selenium.By]::ClassName('')
[OpenQA.Selenium.By]::Id('')
[OpenQA.Selenium.By]::LinkText('')
[OpenQA.Selenium.By]::Name('')
[OpenQA.Selenium.By]::PartialLinkText('')
[OpenQA.Selenium.By]::TagName('')
Например, чтобы выбрать кнопку и щелкнуть по ней в этом примере нужно выбрать элемент и вызвать метод Click:
$selenium.FindElement([OpenQA.Selenium.By]::XPath('/html/body/div[3]/div/div[3]/div/div/div/div[2]/div[3]/div[1]/a/span[4]')).Click()
Выполнив эту команду, вы нажмете кнопку на сайте и запустите тест скорости.
Через несколько секунд на экране появятся результаты тестирования. По аналогии, я скопировал значения XPath для двух HTML элементов, в которых отображается Upload и Download скорости.
Текстовые значения элементов можно получить с помощью свойства .text. Т.к. сервису нужно некоторое время на измерение скоростей, я добавил задержку 60 секунд перед проверкой значений на странице:
sleep 60
$cur_download_speed=$selenium.FindElement([OpenQA.Selenium.By]::XPath('/html/body/div[3]/div/div[3]/div/div/div/div[2]/div[3]/div[3]/div/div[3]/div/div/div[2]/div[1]/div[1]/div/div[2]/span')).text
$cur_upload_speed=$selenium.FindElement([OpenQA.Selenium.By]::XPath('/html/body/div[3]/div/div[3]/div/div/div/div[2]/div[3]/div[3]/div/div[3]/div/div/div[2]/div[1]/div[2]/div/div[2]/span')).text
Write-host "Download: $cur_download_speed MBps, Upload: $cur_upload_speed MBps"
После завершения работы скрипта, нужно корректно выгрузить из памяти объекты браузера и библиотеку Selenium.
$selenium.Close()
$selenium.Quit()
При закрытии браузера кэш и куки очищаются.
Таким образом, у вас получился небольшой PowerShell скрипт, который автоматически выполняет действие на веб странице и возвращает вам результаты.
Использование PowerShell и Selenium в веб-интерфейсах администрирования
Возможности Selenium можно использовать в задачах администрирования или мониторинга различных продуктов, которые управляются через веб интерфейс.
В следующем примере, мы покажем, как из скрипта PowerShell подключиться к веб интерфейсу Proxmox VE, автоматически ввести пароль и получить информацию о состоянии виртуальных машинах.
Для подключения к веб-интерфейсу Proxmox воспользуемся следующим кодом:
$path = "C:PSselenium"
$log = "$pathChromeDriver.log"
$ChromeDriver = "$pathChromeDriver.exe"
$WebDriver = "$pathWebDriver.dll"
$ChromeOptions = New-Object OpenQA.Selenium.Chrome.ChromeOptions
# Игнорировать предупреждения Chrome о самоподписанных и недействительных сертификатах
$ChromeOptions.AcceptInsecureCertificates = $True
# скрыть окно браузера при запуске
#$ChromeOptions.AddArgument("headless")
# запустить окно браузера свернутым
#$ChromeOptions.AddArgument("start-minimized")
$ChromeDriverService = [OpenQA.Selenium.Chrome.ChromeDriverService]::CreateDefaultService($ChromeDriver)
$ChromeDriverService.HideCommandPromptWindow = $True
$Selenium = New-Object OpenQA.Selenium.Chrome.ChromeDriver($ChromeDriverService, $ChromeOptions)
$Selenium.Navigate().GoToURL('https://192.168.31.95:8006/')
Для подключения к веб интерфейсу Proxmox пользователю нужно ввести имя пользователя и пароль. С помощью Selenium вы можете заполнить формы и отправить данные на сайт. В этом примере нужно, как описано выше получить XPath полей для ввода имени пользователя и пароля и передать в них данные.
$username= $selenium.FindElement([OpenQA.Selenium.By]::XPath('/html/body/div[9]/div[2]/div/div/div/div/div/div[1]/div/div/div/div[1]/div/div/div/input'))
$username.Click()
#отправить имя пользователя
$username.SendKeys('root')
$password=$selenium.FindElement([OpenQA.Selenium.By]::XPath('/html/body/div[9]/div[2]/div/div/div/div/div/div[1]/div/div/div/div[2]/div/div/div/input'))
$password.Click()
#отправить пароль
$password.SendKeys('mypass123')
Чтобы выполнить вход, нужно нажать на кнопку Login (вызвать метод Click).
$selenium.FindElement([OpenQA.Selenium.By]::XPath('/html/body/div[9]/div[2]/div/div/div/div/div/div[2]/div/div/a/span/span/span[2]')).Click()
sleep 4
#Нажать кнопку OK в сообщении об отсутствующей подписке Proxmox
$selenium.FindElement([OpenQA.Selenium.By]::XPath('//html/body/div[12]/div[2]/div[2]/div/div/a[1]/span/span/span[2]')).Click()
Теперь нужно перейти в раздел Summary и получить значения из полей о запущенных и остановленных виртуальных машинах.
# Переходим в раздел Summary
$selenium.FindElement([OpenQA.Selenium.By]::XPath('/html/body/div[2]/div/div/div[2]/div[2]/div/div/ul/li[2]/div/div/div[2]')).Click()
# Узнать количество запущенных и остановленных виртуальных машин
sleep 5
$runningVMs= $selenium.FindElement([OpenQA.Selenium.By]::XPath('/html/body/div[2]/div/div/div[3]/div/div/div/div/div/div[2]/div[2]/div/table/tbody/tr[1]/td[1]/div/div[1]/div[2]')).text
$stoppedVMs= $selenium.FindElement([OpenQA.Selenium.By]::XPath('/html/body/div[2]/div/div/div[3]/div/div/div/div/div/div[2]/div[2]/div/table/tbody/tr[1]/td[1]/div/div[2]/div[2]')).text
$selenium.Close()
$selenium.Quit()
# Вывести информацию о ВМ полученную из Proxmox
$runningVMs
$stoppedVMs
В некоторых веб-формах нужно использовать метод Submit для отправки данных из формы:
$form = $selenium.FindElement([OpenQA.Selenium.By]::Xpath('тут_путь'))
$form.Submit()
Некоторые JS элементы интерфейсов на веб сайтах срабатывают только при наведении курсора мыши. Вы можете перевести курсор мыши на объект так:
$action = New-Object OpenQA.Selenium.Interactions.Actions($selenium)
$element = $selenium.FindElement([OpenQA.Selenium.By]::XPath('тут_путь'))
$action.MoveToElement($element).Build().Perform()
В этой статье мы рассмотрели базовые аспекты использования фреймворка Selenium в PowerShell скриптах для автоматизации задач системного администрирования.
Windows 11
Автоматизация любых действий в браузере с помощью PowerShell и Selenium