Автоматизация любых действий в браузере с помощью 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.nupkg\lib\netstandard2.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:\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.

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

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

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

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

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

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

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

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

Автоматическая аутентифкация в веб интерфейсе через 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()
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 и получить значения из полей о запущенных и остановленных виртуальных машинах.

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

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

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

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


Предыдущая статья Следующая статья


Комментариев: 2 Оставить комментарий

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)