【PowerShell】Selenium-Module Get-SeElement Web要素のハンドル

目次

概要

 Selenium-ModuleでWeb要素をハンドルするためのクラスです。SeleniumではWeb要素をキャッチし、色々なメソッドを実行していくため、このWeb要素の取得がSeleniumの基本となります。

 PowerShellでSeleniumを利用するに当たって、ある程度簡易的にSeleniumを利用できる様に専用のモジュールがGitHubに用意されています。いきなりPowerShellでSeleniumを扱うより、Seleniumを-Moduleを利用した方が簡単にPowerShellでSleniumを利用することができます。環境構築するには、以下ページを参照してみてください。

コマンド(Commond)

Get-SeElement

代替コマンド(Alias)

Find-SeElement

構文(Syntax)

Get-SeElement [-Selection] <string> [[-Timeout] <int>] [[-Target] <Object>] [-By <string>] [-Wait] [<CommonParameters>]

オプション

Name引数型解説Short Example
Selection stringFindElementの方法を以下から入力
"CssSelector", "Name", "Id", "ClassName", "LinkText", "PartialLinkText", "TagName", "XPath"
$Element = Get-SeElement -Target $Driver -ClassName "newmark"
Timeout  intタイムアウトの時間を設定$Element = Get-SeElement -Target $Driver -ClassName "newmark" -By ClassName -Timeout 10
Target  ObjectDriverか、親Elementを入力。
Alias:Element, Driver(Element, Driverの区別は無い)
$Element = Get-SeElement -Target $Driver -ClassName "newmark" -By ClassName -Timeout 10
By  stringSelectionの入力項目検証用。手動では設定しない。デフォルト:Xpath
Wait タイムアウト用の引数。Timeoutの引数を指定せず、Waitを設定すると、タイムアウトは、30秒で設定される$Element = Get-SeElement -Target $Driver -ClassName "newmark" -Wait
CommonParameters共通パラメータ

※ShortExampleは、動作確認ができたコードを記載しています。

オブジェクトプロパティ

Name出力例
WrappedDriver                        OpenQA.Selenium.Chrome.ChromeDriver
TagName                              span
Text                                 NEW!
Enabled                              TRUE
Selected                             FALSE
Location                             {X=193,Y=1992}
Size                                 {Width=43,Height=18}
Displayed                            TRUE
LocationOnScreenOnceScrolledIntoView {X=193,Y=1992}
Coordinates                          OpenQA.Selenium.Remote.RemoteCoordinates

※ShortExampleは、動作確認ができたコードを記載しています。

Example

 使用例として、空手協会のPdfリンクテキストをクリックしてPdfファイルをダウンロードする方法を紹介します。Selenium-Moduleの場合、デフォルト設定でPdfファイルリンクのクリックはPdfビューアを開かず、ダウンロードする設定になっております。

$shell = New-Object -ComObject Shell.Application
$DownloadDir = $shell.NameSpace("shell:Downloads").Self.Path
$searchDir = $DownloadDir + "\*.pdf"
$BaseFile = Get-ChildItem -Path $searchDir

$Driver = Start-SeChrome -DefaultDownloadPath $DownloadDir -StartURL "https://www.jka.or.jp/jka-news-pdf/jka-no34-pdf10mb/"
$Element = Find-SeElement -Driver $Driver -PartialLinkText "JKAニュース No34"
Invoke-SeClick -Element $Element

$flg = $false
do {
    $CompFile = Get-ChildItem -Path $searchDir
    $diffResult = Compare-Object $BaseFile $compFile -IncludeEqual
    foreach($data in $diffResult) {
        $indicator = $data.SideIndicator
         # CompFileに存在し、BaseFileには存在しないデータ
         if($indicator -eq "=>") {
            echo $data.InputObject
            $flg = $true
            break
        }else {
            $flg = $false
        }
    }
} until ($flg -eq $true)

Start-Sleep -Seconds 2
SeClose $Driver
1行目

Shell.Applicationクラスの生成

2行目

NemaSpaceメソッドにより、ダウンロードフォルダのディレクトリパスを取得

3行目

ダウンロードフォルダ内のPDFファイルを格納

4行目

ダウンロード前の対象フォルダ内のpdfファイル存在確認

6行目

URLを指定してChromeブラウザを起動

7行目

LinkText:"JKAニュース No34"を指定してリンクテキストを取得

8行目

取得したWeb要素をクリックして、PDFファイルをダウンロード

10~25行目

ダウンロードが完了するまで、待機実行。Compare-Objectを利用してダウンロードフォルダ内に、ダウンロード対象のPDFファイルが保存されるまで検索をし続ける。

27行目

2秒待機

28行目

Chromeブラウザを閉じる

Module

Get-SeElementのSelenium-Module構文を以下に掲載します。

function Get-SeElement {
    [Alias('Find-SeElement', 'SeElement')]
    param(
        #Specifies whether the selction text is to select by name, ID, Xpath etc
        [ValidateSet("CssSelector", "Name", "Id", "ClassName", "LinkText", "PartialLinkText", "TagName", "XPath")]
        [ByTransformAttribute()]
        [string]$By = "XPath",
        #Text to select on
        [Alias("CssSelector", "Name", "Id", "ClassName", "LinkText", "PartialLinkText", "TagName", "XPath")]
        [Parameter(Position = 1, Mandatory = $true)]
        [string]$Selection,
        #Specifies a time out
        [Parameter(Position = 2)]
        [Int]$Timeout = 0,
        #The driver or Element where the search should be performed.
        [Parameter(Position = 3, ValueFromPipeline = $true)]
        [Alias('Element', 'Driver')]
        $Target = $Global:SeDriver,

        [parameter(DontShow)]
        [Switch]$Wait

    )
    process {
        #if one of the old parameter names was used and BY was NIT specified, look for
        # <cmd/alias name> [anything which doesn't mean end of command] -Param
        # capture Param and set it as the value for by
        $mi = $MyInvocation.InvocationName
        if (-not $PSBoundParameters.ContainsKey("By") -and
            ($MyInvocation.Line -match "$mi[^>\|;]*-(CssSelector|Name|Id|ClassName|LinkText|PartialLinkText|TagName|XPath)")) {
            $By = $Matches[1]
        }
        if ($wait -and $Timeout -eq 0) { $Timeout = 30 }

        if ($TimeOut -and $Target -is [OpenQA.Selenium.Remote.RemoteWebDriver]) {
            $TargetElement = [OpenQA.Selenium.By]::$By($Selection)
            $WebDriverWait = [OpenQA.Selenium.Support.UI.WebDriverWait]::new($Target, (New-TimeSpan -Seconds $Timeout))
            $Condition = [OpenQA.Selenium.Support.UI.ExpectedConditions]::ElementExists($TargetElement)
            $WebDriverWait.Until($Condition)
        }
        elseif ($Target -is [OpenQA.Selenium.Remote.RemoteWebElement] -or
            $Target -is [OpenQA.Selenium.Remote.RemoteWebDriver]) {
            if ($Timeout) { Write-Warning "Timeout does not apply when searching an Element" }
            $Target.FindElements([OpenQA.Selenium.By]::$By($Selection))
        }
        else { throw "No valid target was provided." }
    }
}
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

VBAを中心とした自動化、効率化の手法を紹介しています。現在は、SeleniumBasicのexamplesを紹介しています。その内、SeleniumBasic以外の手法も掲載したいと思っております。

目次