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

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

admin

Share
Published by
admin

Recent Posts

Консоль удаленного рабочего стола(rdp console)

Клиент удаленного рабочего стола (rdp) предоставляет нам возможность войти на сервер терминалов через консоль. Что…

2 недели ago

Настройка сети в VMware Workstation

В VMware Workstation есть несколько способов настройки сети гостевой машины: 1) Bridged networking 2) Network…

2 недели ago

Логи брандмауэра Windows

Встроенный брандмауэр Windows может не только остановить нежелательный трафик на вашем пороге, но и может…

2 недели ago

Правильный способ отключения IPv6

Вопреки распространенному мнению, отключить IPv6 в Windows Vista и Server 2008 это не просто снять…

2 недели ago

Ключи реестра Windows, отвечающие за параметры экранной заставки

Параметры экранной заставки для текущего пользователя можно править из системного реестра, для чего: Запустите редактор…

2 недели ago

Как управлять журналами событий из командной строки

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

2 недели ago