Для автоматизации различных действий в браузере из скриптов 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'_x000D_$env:Path += ";$selenium_path"
Импорт библиотеки Selenium:
Import-Module "$selenium_pathWebDriver.dll"
Создать объект браузера и перейти на указанный URL:
$selenium = New-Object OpenQA.Selenium.Chrome.ChromeDriver -ArgumentList $selenium_path_x000D_$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('')_x000D_[OpenQA.Selenium.By]::Id('')_x000D_[OpenQA.Selenium.By]::LinkText('')_x000D_[OpenQA.Selenium.By]::Name('')_x000D_[OpenQA.Selenium.By]::PartialLinkText('')_x000D_[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_x000D_$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_x000D_$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_x000D_Write-host "Download: $cur_download_speed MBps, Upload: $cur_upload_speed MBps"
После завершения работы скрипта, нужно корректно выгрузить из памяти объекты браузера и библиотеку Selenium.
$selenium.Close()_x000D_$selenium.Quit()
При закрытии браузера кэш и куки очищаются.
Таким образом, у вас получился небольшой PowerShell скрипт, который автоматически выполняет действие на веб странице и возвращает вам результаты.
Использование PowerShell и Selenium в веб-интерфейсах администрирования
Возможности Selenium можно использовать в задачах администрирования или мониторинга различных продуктов, которые управляются через веб интерфейс.
В следующем примере, мы покажем, как из скрипта PowerShell подключиться к веб интерфейсу Proxmox VE, автоматически ввести пароль и получить информацию о состоянии виртуальных машинах.
Для подключения к веб-интерфейсу Proxmox воспользуемся следующим кодом:
$path = "C:PSselenium"_x000D_$log = "$pathChromeDriver.log"_x000D_$ChromeDriver = "$pathChromeDriver.exe"_x000D_$WebDriver = "$pathWebDriver.dll"_x000D_$ChromeOptions = New-Object OpenQA.Selenium.Chrome.ChromeOptions_x000D_# Игнорировать предупреждения Chrome о самоподписанных и недействительных сертификатах_x000D_$ChromeOptions.AcceptInsecureCertificates = $True_x000D_# скрыть окно браузера при запуске_x000D_#$ChromeOptions.AddArgument("headless")_x000D_# запустить окно браузера свернутым_x000D_#$ChromeOptions.AddArgument("start-minimized")_x000D_$ChromeDriverService = [OpenQA.Selenium.Chrome.ChromeDriverService]::CreateDefaultService($ChromeDriver)_x000D_$ChromeDriverService.HideCommandPromptWindow = $True_x000D_$Selenium = New-Object OpenQA.Selenium.Chrome.ChromeDriver($ChromeDriverService, $ChromeOptions)_x000D_$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'))_x000D_$username.Click()_x000D_#отправить имя пользователя_x000D_$username.SendKeys('root')_x000D_$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'))_x000D_$password.Click()_x000D_#отправить пароль_x000D_$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()_x000D_sleep 4_x000D_#Нажать кнопку OK в сообщении об отсутствующей подписке Proxmox_x000D_$selenium.FindElement([OpenQA.Selenium.By]::XPath('//html/body/div[12]/div[2]/div[2]/div/div/a[1]/span/span/span[2]')).Click()_x000D_
Теперь нужно перейти в раздел Summary и получить значения из полей о запущенных и остановленных виртуальных машинах.
# Переходим в раздел Summary_x000D_$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()_x000D_# Узнать количество запущенных и остановленных виртуальных машин_x000D_sleep 5_x000D_$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_x000D_$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_x000D_$selenium.Close()_x000D_$selenium.Quit()_x000D_# Вывести информацию о ВМ полученную из Proxmox_x000D_$runningVMs_x000D_$stoppedVMs
В некоторых веб-формах нужно использовать метод Submit для отправки данных из формы:
$form = $selenium.FindElement([OpenQA.Selenium.By]::Xpath('тут_путь'))_x000D_$form.Submit()
Некоторые JS элементы интерфейсов на веб сайтах срабатывают только при наведении курсора мыши. Вы можете перевести курсор мыши на объект так:
$action = New-Object OpenQA.Selenium.Interactions.Actions($selenium)_x000D_$element = $selenium.FindElement([OpenQA.Selenium.By]::XPath('тут_путь'))_x000D_$action.MoveToElement($element).Build().Perform()
В этой статье мы рассмотрели базовые аспекты использования фреймворка Selenium в PowerShell скриптах для автоматизации задач системного администрирования.