DEV Community

Cover image for Consumindo a dll do Selenium WebDriver | Powershell 7
Ewerton Jordão
Ewerton Jordão

Posted on

1

Consumindo a dll do Selenium WebDriver | Powershell 7

Como utilizar uma dll .Net no PowerShell.

E ai, pessoal, beleza? Trazendo um assunto bem legal que é misturar um framework de automação (PowerShell 7) e uma ferramenta * que utilizaríamos para QA(Quality Assurance) *Selenium WebDriver .

Se por acaso você não sabe o PowerShell foi reescrito em .Net Core, na data que escrevo este texto estamos na versão 3.1 e consequentemente o PowerShell vem evoluindo em conjunto com o .Net, atualmente estamos na versão 7.0(Pwsh), por ser escrito em .Net eu consigo importar as dlls que eu utilizaria em uma aplicação C# no PowerShell, instanciar objetos, interagir com as propriedades e os seu métodos.

Nesta demonstração utilizo o site do DevShow podcast para fazer o webscrap(extrair dados de uma página web) neste caso para pegar a uri para os downloads dos episódios disponíveis. Para você que não conhece, neste podcast falamos de inúmeros assuntos de tecnologia, fica a dica para nos acompanhar 😉 no seu agregador de podcast favorito ou utilizando o código que vou disponibilizar🐱‍💻🧠 e realizar o download dos episódios que quiser, vamos lá?

  • Requisitos
    • Download do pacote nuget do Selenium(no nosso caso vou utilizar a versão Alpha05 para utilizar em conjunto do Edge Chromium base, a versão Alpha em especial é para utilizar o modo furtivo a.k.a headless 😂😂😂 ).
    • Download WebDriver compatível com a versão do seu navegador.
    • Incluir o diretório do WebDriver nas variáveis de ambiente (Você pode incluir o diretório do WebDriver no construtor do EdgeDriver assim como eu faço nessa demonstração, porem você pode tranquilamente incluir o path nas variáveis de ambiente).

Estrutura de pastas

  • PastadoScript
    • script.ps1
    • wishlist.txt
  • selenium.webdriver.X.X.X
    • lib
      • netstandard2.0
        • WebDriver.dll
  • WebDriver
    • webdriver.exe

Código fonte

Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force
Install-Module Microsoft.PowerShell.ConsoleGuiTools
Import-Module Microsoft.PowerShell.ConsoleGuiTools
Add-Type -Path ".\selenium.webdriver.4.0.0-alpha05\lib\netstandard2.0\WebDriver.dll"
$pathWebDriver = ".\WebDriver"
$edgeOptions = New-Object OpenQA.Selenium.Edge.EdgeOptions
$edgeOptions.UseChromium = $true
$edgeOptions.AddArgument("headless","log-level=3")
$edgeOptions.AddArgument()
$edgeMarionete = New-Object OpenQA.Selenium.Edge.EdgeDriver($pathWebDriver,$edgeOptions)
$edgeMarionete.Navigate().GoToUrl("https://devshow.com.br/ultimos-episodios/")
[array]$epObjList =@()
$episodesList = $edgeMarionete.FindElementsByClassName("episodes-listing")
$qtdEpisodios = $episodesList.FindElementsByTagName("article")
for ($i = 1; $i -le $qtdEpisodios.Count; $i++) {
$header = $edgeMarionete.FindElementsByXPath("//div/article[$i]/div/div/header/h2/a")
$description = $edgeMarionete.FindElementsByXPath("//div/article[$i]/div/div/div[2]/p")
$uriDownload = $edgeMarionete.FindElementsByXPath("//div/article[$i]/div/div/div[1]/div/div/div/div[3]/div[6]/a")
$epObj = [PSCustomObject]@{
header=$header.Text
description =$description.Text
uriDownload= $uriDownload.GetProperty("href")
}
$epObjList+=$epObj
}
$edgeMarionete.close()
$epObjList.uriDownload | Out-ConsoleGridView -PassThru | Out-File .\wishlist.txt
[array]$filenameUgly = (Get-Content .\wishlist.txt) | ForEach-Object {($_ -split "/").Item(7)}
[array]$filenameBeauty = @()
for ($i = 0; $i -lt $filenameUgly.Count; $i++) {
$filenameBeauty += ($filenameUgly.Item($i)).substring(0, $filenameUgly.Item($i).IndexOf('?'))
}
if(!(Test-Path .\_devshowpodcast)){
New-Item -Name _devshowpodcast -ItemType Directory
}
$uriWishList = (Get-Content .\wishlist.txt)
for ($i = 0; $i -lt $filenameBeauty.Count; $i++) {
Write-Host "Download ep" $filenameBeauty.item($i)
$outfile = ".\_devshowpodcast\{0}" -f $filenameBeauty.Item($i)
Invoke-WebRequest -uri $uriWishList.item($i) -OutFile $outfile -DisableKeepAlive
}
# para efeito de teste implementei o foreach-object parallel, teste e observe a velocidade com que os downloads serão feitos.
if ((-join $PSVersionTable.psversion) -ge "7.0.0"){
$uriWishList | ForEach-Object -ThrottleLimit 4 -Parallel {
$uriResult = ($_ -split "/").Item(7)
$resultEpname = $uriResult.substring(0, $uriResult.IndexOf('?'))
$outfile = ".\_devshowpodcast\{0}" -f $resultEpname
Invoke-WebRequest -uri $_ -OutFile $outfile -DisableKeepAlive
} } else {throw "Você precisa ter instalado o powershell core https://aka.ms/pscore6"}

Resultado

Gif mostrando a execução do código e enfatizando o modo headless no msedge Chromium

Imagem com o resultado dos 3 downloads no file explorer, três arquivos com tamanhos distintos vindos do site do podcast

É isso pessoal, vimos como é simples utilizar uma dll e dar novos poderes a nossa sessão no PWSH, com pouco menos de 50 linhas de código implementamos uma solução pratica em linha de comando 😉, espero que tenham curtido o assunto, forte abraço. E não se esqueça, PWSH7 é vida ❤.

Referência

Documentação Edge(Chromium)

Documentação Selenium .Net

Exemplos Selenium

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay