概要
Selenium-ModuleでWeb要素をハンドルするためのクラスです。SeleniumではWeb要素をキャッチし、色々なメソッドを実行していくため、このWeb要素の取得がSeleniumの基本となります。
コマンド(Commond)
Get-SeElement
代替コマンド(Alias)
Find-SeElement
構文(Syntax)
Get-SeElement [-Selection] <string> [[-Timeout] <int>] [[-Target] <Object>] [-By <string>] [-Wait] [<CommonParameters>]
オプション
Name | 引数型 | 解説 | Short Example |
---|---|---|---|
Selection | string | FindElementの方法を以下から入力 "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 | Object | Driverか、親Elementを入力。 Alias:Element, Driver(Element, Driverの区別は無い) | $Element = Get-SeElement -Target $Driver -ClassName "newmark" -By ClassName -Timeout 10 |
By | string | Selectionの入力項目検証用。手動では設定しない。デフォルト: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." }
}
}