PowershellでSeleniumを使う
PowershellでSeleniumを使いたい人、たんさんいらっしゃるかと思われますが、現在検索しても古い情報しか載っていないので私が躓いた点も交えながら詳細を書きます。
※Chromeのお話なのでEdgeやIE、FireFoxやOperaメインの方はごめんなさい。
記事作成段階の各ソフトウェアバージョンは下記の通りです。
・Powershell - 5.1.19041.1320
・Google Chrome - 97.0.4692.99(Official Build) (64 ビット)
・前提 - ダウンロード
PowershellでSeleniumを使う際は必ず以下の3点が必要です。
①WebDriver
www.selenium.dev
②WebDriverSupport.dll
www.nuget.org
※上記2つは拡張子がnupkgになっているので、nupkg解凍に対応したソフトウェアを使うか
拡張子を.zipに変えて試してみてください。
③chromedriver.exe
chromedriver.chromium.org
それぞれダウンロード先を埋め込みましたのでダウンロードしてください。
WebDriver,WebDriverSupportは解凍したフォルダ内の「lib\net**\」に.dllがあります。
・前提 - 環境構築
上記3点をダウンロードしてきたら、使いやすいように1か所にまとめましょう。
私は「Automation」というフォルダを作りました。
階層は下記の通りです。
AUTOMATION
│ automation.ps1
│
└─Data
│ chromedriver.exe
│
└─Selenium
│ .signature.p7s
│ Selenium.WebDriver.nuspec
│ [Content_Types].xml
│
├─images
│ icon.png
│
├─lib
│ ├─net45
│ │ WebDriver.dll
│ │
│ ├─net46
│ │ WebDriver.dll
│ │
│ ├─net47
│ │ WebDriver.dll
│ │
│ ├─net48
│ │ WebDriver.dll
│ │ WebDriver.Support.dll
│ │
│ ├─net5.0
│ │ WebDriver.dll
│ │
│ ├─netstandard2.0
│ │ WebDriver.dll
│ │
│ └─netstandard2.1
│ WebDriver.dll
│
├─package
│ └─services
│ └─metadata
│ └─core-properties
│ 8e4661a2052a4ed982f115e944130cde.psmdcp
│
└─_rels
.rels
今回使用するのはnet48なので、その中に「WebDriverSupport.dll」を入れてあります。
chromedriver.exeに関しては「Data」フォルダ直下に入れてます。
ここまで準備が整ったらあとはコーディングしていくだけです。
・コーディング
とりあえず私の書いたコードを載せます。
$dllPath = $null if($host.Name -match "ise"){ #ise上からでは$PSScriptRootが使えないため $dllPath = Split-Path $psISE.CurrentFile.FullPath -Parent } else { #ise以外で呼び出された際の処理 if($PSVersionTable.PSVersion.Major -ge 3){ #power shellのversionが3以上なら $dllPath = $PSScriptRoot } else { #3未満なら $dllPath = Split-Path $MyInvocation.MyCommand.Path -Parent } } $WebDriverPath ="$dllPath\Data\Selenium\lib\net48\WebDriver.dll" $WebDriverSupportPath = "$dllPath\Data\Selenium\lib\net48\WebDriver.Support.dll" $ChromeDriverPath = "$dllPath\Data\" Add-Type -Path $WebDriverPath Add-Type -Path $WebDriverSupportPath $driver = New-Object OpenQA.Selenium.Chrome.ChromeOptions $chromeDriver = New-Object OpenQA.Selenium.Chrome.ChromeDriver($ChromeDriverPath,$driver) $chromeDriver.Url = "https://www.google.co.jp" $box = $chromeDriver.FindElement([OpenQA.Selenium.By]::Name("q")) $box.SendKeys("powershell") $box.SendKeys([OpenQA.Selenium.Keys]::Enter) Start-Sleep -s 5 $chromeDriver.Quit()
それぞれ解説します。
$dllPath = $null if($host.Name -match "ise"){ #ise上からでは$PSScriptRootが使えないため $dllPath = Split-Path $psISE.CurrentFile.FullPath -Parent } else { #ise以外で呼び出された際の処理 if($PSVersionTable.PSVersion.Major -ge 3){ #power shellのversionが3以上なら $dllPath = $PSScriptRoot } else { #3未満なら $dllPath = Split-Path $MyInvocation.MyCommand.Path -Parent } }
これはPowershell ISE上で編集する際、現在のカレントディレクトリを取得する$PSScriptRootが使えないため、ISE上からプログラムを動作させた場合とそうでない場合でカレントディレクトリの取得方法を分けています。
$WebDriverPath ="$dllPath\Data\Selenium\lib\net48\WebDriver.dll" $WebDriverSupportPath = "$dllPath\Data\Selenium\lib\net48\WebDriver.Support.dll" $ChromeDriverPath = "$dllPath\Data\" Add-Type -Path $WebDriverPath Add-Type -Path $WebDriverSupportPath
ここでダウンロードしてきたdll、exeのパスを指定しています。
その後、Add-Typeでライブラリを呼んでいます。
$driver = New-Object OpenQA.Selenium.Chrome.ChromeOptions $chromeDriver = New-Object OpenQA.Selenium.Chrome.ChromeDriver($ChromeDriverPath,$driver)
ここでオブジェクトを作成しています。
$chromeDriver.Url = "https://www.google.co.jp"
$box = $chromeDriver.FindElement([OpenQA.Selenium.By]::Name("q")) $box.SendKeys("powershell") $box.SendKeys([OpenQA.Selenium.Keys]::Enter)
googleの検索ボックスに「powershell」と入力し、検索する処理です。
一番私が躓いた処理でもあります。
リファレンス通り
$box = $chromeDriver.FindElement(By.Name("q"))
と書いてもエラーが出て処理してくれません。
なのでSeleniumのFunctionですよと明示する必要があります。
それが([OpenQA.Selenium.By]::Nameなのです。
SendKeysで検索ボックスにテキストを送っています。
あとはEnterキーを押下する処理を送るだけです。
Start-Sleep -s 5 $chromeDriver.Quit()
結果を確認したかったのでとりあえず5秒待機させています。
その後、Quit()でWebDriverを閉じています。
SeleniumのリファレンスにはPowershellの例がないのでちゃんと動作させるのに3時間ぐらい費やしました...
Powershell、開発環境を入れられない端末でも使える言語なのですごい重宝するのですが、いかんせん凝ったプログラムはCやJava、Pythonで説明しているものが多いのでなかなか大変です。
次回はPowershellつながりで、UIAutomationについて書こうかと思います。