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
- netstandard2.0
- lib
- 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

É 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 ❤.
Top comments (0)