Автоматизация любых действий в браузере с помощью PowerShell и Selenium

Для автоматизации различных действий в браузере из скриптов PowerShell можно использовать фреймворк Selenium . С помощью Selenium вы можете получить содержимое веб страницы так, как его видит пользователь (отрабатываются все скрипты Java, стили, куки) Чаще всего Selenium используется для тестирования веб-сайтов с имитацией действий реального пользователя, но также он может быть полезным инструментом системного администратора для автоматизации действий и получения данных из веб-приложений и панелей управления. Например, с помощью Selenium вы можете автоматически выполнить любые действий в произвольном веб-интерфейсе администрирования, для которого отсутствует открытый доступ через API или веб хуки. Выполнить автоматический вход в веб интерфейс приложения, переходить по ссылкам, щёлкать по элементам или кнопкам в панели управления, заполнять и отправлять данные в формах, имитировать движение мыши, делать скриншоты веб страницы – все этом возможно с помощью Selenium.
В этой статье мы рассмотрим, как системный администратор Windows может использовать возможности фреймворка Selenium в скриптах PowerShell (статья предназначена для администраторов, далеких от веб программирования).

Возможности встроенного PowerShell командлета Invoke-WebRequest при доступе веб сайтом весьма ограничены. При открытии сайта он не выполняет Javascript код, не меняет User-Agent, не позволяет эмулировать движение мыши.

Установка библиотеки и драйвера 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 Webdriver.dll драйвер фреймворка Selenium

  • Скачайте драйвер для браузера, в котором вы будете обращаться к сайтам из Selenium. Доступны драйвера для браузеров Firefox, Opera, Edge, Safari. В моем примере я буду использовать драйвер для Google Chrome . Скачайте драйвер для своей версии Google Chrome здесь (версия драйвера и браузера на компьютере должны совпадать). Поместите файл chromedriver.exe в каталог с библиотекой (не забудьте разблокировать скачанный из интернета исполняемый файл ). chromedriver.exe - драйвер браузера chrome для selenium

Взаимодействие с браузером из скрипта 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 .

Получения 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()

Выполнив эту команду, вы нажмете кнопку на сайте и запустите тест скорости.

нажать кнопку на веб сайте, метод click selenium

Через несколько секунд на экране появятся результаты тестирования. По аналогии, я скопировал значения XPath для двух HTML элементов, в которых отображается Upload и Download скорости.

консоль разработчика chrome - скопировать xpath

Текстовые значения элементов можно получить с помощью свойства .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"

получить данные с веб страницы в PowerShell

После завершения работы скрипта, нужно корректно выгрузить из памяти объекты браузера и библиотеку 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')

Автоматическая аутентифкация в веб интерфейсе через Selenium

Чтобы выполнить вход, нужно нажать на кнопку 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 и получить значения из полей о запущенных и остановленных виртуальных машинах.

Получить данные с веб интерфейса управления виртуализацией Proxmox через драйвер Selenium

# Переходим в раздел 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

Получить результаты из браузера в PowerShell скрипте

В некоторых веб-формах нужно использовать метод 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 скриптах для автоматизации задач системного администрирования.

EnglishRussianUkrainian