Для автоматизации различных действий в браузере из скриптов 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.nupkg\lib\netstandard2.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:\PS\selenium' $env:Path += ";$selenium_path"
Импорт библиотеки Selenium:
Import-Module "$selenium_path\WebDriver.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:\PS\selenium" $log = "$path\ChromeDriver.log" $ChromeDriver = "$path\ChromeDriver.exe" $WebDriver = "$path\WebDriver.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 скриптах для автоматизации задач системного администрирования.