SeleniumBasicでドロップダウンリストを扱う構文を紹介します。
- 利用目的は業務効率化です。(テスト自動化ではありません)
- ブラウザはGoogleChromeが対象です。(EdgeやFirefoxは対象外)
- 原文のVBAでは現在エラー発生する場合が多いため、修正を加えてます。
Examples.xlsmの保存場所(ここをクリック)
Examples.xlsmが保存されている場所は、SeleniumBasicがインストールされているサブフォルダ内になります。SeleniumBasicのインストール完了時に保存フォルダを確認することができます。ただ、大体以下フォルダのどちらかにファイル保存されています。
- C:\Program Files\Seleniumbasic\Examples\Excel
- shell:Local AppData\SeleniumBasic\Examples\Excel
ドロップダウンリストから選択(シングルセレクト)
ホームページにあるドロップダウンから一つ選択をしたい場合に、以下の様な構文を実行します。
Private Sub Handle_Dropdown_List()
Dim Assert As New Selenium.Assert
Dim Driver As New ChromeDriver
Driver.Get "https://the-internet.herokuapp.com/dropdown"
Stop
Dim ele As SelectElement
Set ele = Driver.FindElementById("dropdown").AsSelect
ele.SelectByText "Option 2"
Assert.Equals "Option 2", ele.SelectedOption.Text
Stop
Driver.Quit
End Sub
6行目:SelectElement型として変数宣言。これで、ドロップダウンから選択するための準備ができました。
7行目:ドロップダウンのWeb要素を取得し、AsSelectメソッドでドロップダウンから選択するメソッドを設定します。
8行目:SelectByTextメソッドでドロップダウンリストの"Option 2"をテキストで指定し、選択実行します。
9行目:Assertで選択した項目が合致しているか確認
SelectByの種類は3種類あります。
・SelectByText 選択項目のテキストでリスト指定
・SelectByIndex 上から順番でリスト指定(インデックス開始は0から)
・SelectByValue Value値の設定がある場合に指定
セレクトボックスから選択(マルチセレクト)
ホームページにあるセレクトボックスで複数選択が可能な場合の処理構文を紹介します。今回は、セレクトボックスの全項目を選択する構文の紹介になります。
Private Sub Handle_Multi_Select()
Dim Keys As New selenium.Keys
Dim Driver As New ChromeDriver
Driver.Get "https://bayashita.com/p/entry/show/24"
Dim ele As WebElement, eles As WebElements
Set eles = Driver.FindElementsByXPath("//*[contains(@id,'list1')]/*[contains(@option,'')]")
For Each ele In eles
ele.Click Keys.Control
Next ele
Stop
Driver.Quit
End Sub
5行目:FindElementsByXPathメソッドにてXPathで取得できるlistを部分一致検索で複数選択できる様にeles変数に代入します。Xpathの部分一致検索は、こちらのページを参照ください。
6~8行目:For Eachでelesをループして、Ctrl + Clickで複数選択を実行します。
ChromeのディベロッパーツールでXpathの構造を視覚で確認したいと思います。
1項目の<option value="1">のXPathをコピーすると、以下のテキストを取得します。
//*[@id="list1"]/option[1]
このXPathから部分一致検索で5行分を選択するためにcontains表現を利用します。
*[contains(@id,'list1')]:Xpathでidがlist1になっているノードをキャッチししています。"*"を"select"に置換えてもOKです。
*[contains(@option,'')]:list1の下層にある要素の内、option要素を全て選択するため、シングルクォーテーション(')を二つ並べて、値を指定しない様にします。分かりにくいですが、''はダブルクォーテーションではなく、シングルクォーテーションを二つ並べている状態です。色々やり方を試してみましたが、要素を全て選択するためには、値を入力しない方法が正解の様です。