某PCショップ店員の覚書

勤務中に作成したプログラムやスクリプトのまとめ

PowershellでSeleniumを使う

PowershellSeleniumを使いたい人、たんさんいらっしゃるかと思われますが、現在検索しても古い情報しか載っていないので私が躓いた点も交えながら詳細を書きます。
Chromeのお話なのでEdgeやIEFireFoxOperaメインの方はごめんなさい。

記事作成段階の各ソフトウェアバージョンは下記の通りです。

Powershell - 5.1.19041.1320
Google Chrome - 97.0.4692.99(Official Build) (64 ビット)



・前提 - ダウンロード

PowershellSeleniumを使う際は必ず以下の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"

chromeを起動させた後、googleに飛びます。


$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やJavaPythonで説明しているものが多いのでなかなか大変です。

次回はPowershellつながりで、UIAutomationについて書こうかと思います。