Seleniumって何?って方
SeleniumBasicって何?って言う方は、まずはこちらの記事をどうぞ。
始め方を説明しています!
SeleniumBasicの始め方
SeleniiumBasicの使い方
上の記事のように、前回SeleniumBasicの初めかたと、簡単なWEBブラウザの操作(検索ボックスで検索する)方法を紹介しました!
この記事では、もう少し踏み込んだSeleniumBasicで出来ることについて紹介したいと思います!
今回もChromeブラウザでYahooのトップページを操作することを前提に説明します!
次のコードは、はじめ方でも紹介している基本のコードです。
Sub sample()
' Seleniumのインスタンス生成(お決まり文言)
Dim Driver As New Selenium.WebDriver
Driver.Start "chrome" ' chrome使うからこれ
' 引数に開きたいURLを指定する
Driver.Get "https://www.yahoo.co.jp/"
' ****ここに処理書く****
' 終了処理
Driver.Close
Set driver = Nothing
End Sub
画面の最大化
Driver.Window.Maximize
ブラウザのWindowを最大化します。
Wait処理(次の処理を待つ)
Driver.Wait ミリ秒
Seleniumは、IE操作と違って、ページロードを自動で待ってくれるのでIE操作よりはやりやすいですが、それでもこれが必要なことも多々あります。
”ミリ秒”で指定するので注意してください。
要素の取得
まずは、検索や送信ボタン決定ボタンなど要素の取得方法です。
Classで指定する
HTMLの各タグに設定されているClassで指定します。
Driver.FindElementByClass("Class名")
タグの中に「Class=”***”」みたいになっているところがあるのでそれです。
Sub sample()
' Seleniumのインスタンス生成(お決まり文言)
Dim Driver As New Selenium.WebDriver
Driver.Start "chrome" ' chrome使うからこれ
' 引数に開きたいURLを指定する
Driver.Get "https://www.yahoo.co.jp/"
' クラス名で検索ボックスを取得
Dim elm As WebElement
Set elm = Driver.FindElementByClass("_1wsoZ5fswvzAoNYvIJgrU4")
elm.SendKeys "ひらちん"
' 表示止めるため
Stop
' 終了処理
Driver.Close
Set Driver = Nothing
End Sub
idで指定する
HTMLの各タグの中にあるidで指定します。
Driver.FindElementById("id名")
使い方はClassで指定するのと同じなので省略します。
Nameで指定する
HTMLの各タグの中にあるNameで指定します。
Driver.FindElementByName("Name名")
使い方はClassで指定するのと同じなので省略します。
Tagで指定する
HTMLの各タグ自体で指定します。
Driver.FindElementByTag("Tag名")
使い方はClassで指定するのと同じなので省略します。
でも、ページの中に1つしか無いタグってあるか??って感じですね。
CSSのSelectorで指定する
始め方の記事でも紹介しましたが、CSSのSelectorを使って指定します。
※SeleniumBasicの始め方 https://hirachin.com/post-4987/
Driver.FindElementByCss("Selector")
また、セレクターはChromeブラウザのデベロッパーツールでコピーが簡単に出来ましたね。
詳しくは、始め方の記事にありますので参照してください(^^)
Sub sample()
' Seleniumのインスタンス生成(お決まり文言)
Dim Driver As New Selenium.WebDriver
Driver.Start "chrome" ' chrome使うからこれ
' 引数に開きたいURLを指定する
Driver.Get "https://www.yahoo.co.jp/"
' セレクターで検索ボックスを取得
Dim elm As WebElement
Set elm = Driver.FindElementByCss("#ContentWrapper > header > section._1o9PYyvuVafb5hd9eJ9rYX > div > form > fieldset > span > input")
elm.SendKeys "ひらちん"
' 表示止めるため
Stop
' 終了処理
Driver.Close
Set Driver = Nothing
End Sub
テキストボックスに文字を入れる
WebElement.SendKeys "文字列"
取得したテキストボックス(WebElement)に文字を入力します。
Sub sample()
' Seleniumのインスタンス生成(お決まり文言)
Dim Driver As New Selenium.WebDriver
Driver.Start "chrome" ' chrome使うからこれ
' 引数に開きたいURLを指定する
Driver.Get "https://www.yahoo.co.jp/"
' ***検索ボックスに「ひらちんの部屋」と入力***
Dim elm As WebElement
Set elm = Driver.FindElementByCss("#ContentWrapper > header > section._1o9PYyvuVafb5hd9eJ9rYX > div > form > fieldset > span > input")
elm.SendKeys "ひらちんの部屋"
' 終了処理
Driver.Close
Set Driver = Nothing
End Sub
ここでは、WebElementを取得するために、FindElementByCssを使っています。
Enterで確定する
WebElement.SendKeys skey.Enter
EnterKeyで確定する動作です。
キーボードのキー操作をするために、Selenium.Keysというものが用意されています。
利用する際には、先にインスタンスを生成しておく必要があります。
Sub sample()
' Seleniumのインスタンス生成(お決まり文言)
Dim Driver As New Selenium.WebDriver
Driver.Start "chrome" ' chrome使うからこれ
' 引数に開きたいURLを指定する
Driver.Get "https://www.yahoo.co.jp/"
' 検索ボックスに「ひらちんの部屋」と入力
Dim elm As WebElement
Set elm = Driver.FindElementByCss("#ContentWrapper > header > section._1o9PYyvuVafb5hd9eJ9rYX > div > form > fieldset > span > input")
elm.SendKeys "ひらちんの部屋"
' キーボードのキー操作するための準備
Dim sKey As New Selenium.Keys
elm.SendKeys sKey.Enter
' 表示止めるため
Stop
' 終了処理
Driver.Close
Set Driver = Nothing
End Sub
Yahooでは、検索ボックスにテキスト入力したあとに、Enterキーを押すと検索されますね。
上のコードを実行すると、「ひらちんの部屋」での検索結果が表示されます。
※一気に実行すると、処理が終わったときにブラウザが閉じてしまうので「Stop」入れてます。ステップ実行するならいらないです。
ボタンをクリックする
WebElement.Click
取得した要素をクリックします。
Sub sample()
' Seleniumのインスタンス生成(お決まり文言)
Dim Driver As New Selenium.WebDriver
Driver.Start "chrome" ' chrome使うからこれ
' 引数に開きたいURLを指定する
Driver.Get "https://www.yahoo.co.jp/"
' 検索ボックスにテキストを入力
Dim elm As WebElement
Set elm = Driver.FindElementByCss("#ContentWrapper > header > section._1o9PYyvuVafb5hd9eJ9rYX > div > form > fieldset > span > input")
elm.SendKeys "ひらちん"
' 検索ボタンをクリックして検索
Dim elm_検索ボタン As WebElement
Set elm_検索ボタン = Driver.FindElementByCss("#ContentWrapper > header > section._1o9PYyvuVafb5hd9eJ9rYX > div > form > fieldset > span > button > span")
elm_検索ボタン.Click
' 表示止めるため
Stop
' 終了処理
Driver.Close
Set Driver = Nothing
End Sub
プルダウン(ドロップダウン)メニューの選択
Yahooのトップページには、プルダウンメニューが無いので、SUUMOの検索画面(https://suumo.jp/chintai/hyogo/en_JRtokaidohonsen/)で試します。
テキストで選択する場合
WebElement.AsSelect.SelectByText "値"
テキストを指定して選択
Sub sample()
' Seleniumのインスタンス生成(お決まり文言)
Dim Driver As New Selenium.WebDriver
Driver.Start "chrome" ' chrome使うからこれ
' 引数に開きたいURLを指定する
Driver.Get "https://suumo.jp/chintai/hyogo/en_JRtokaidohonsen/"
' プルダウンメニューを選択
Dim elm As WebElement
Set elm = Driver.FindElementByCss("#js-shiborikomiForm > div > div.ui-section-body > div.l-refinetable > table > tbody > tr:nth-child(1) > td > div > select:nth-child(1)")
elm.AsSelect.SelectByText "3万円以上"
' 表示止めるため
Stop
' 終了処理
Driver.Close
Set Driver = Nothing
End Sub
Valueで選択する場合
WebElement.AsSelect.SelectByValue "値"
optionタグのバリューの値で指定する
バリューは次の画像のようなところです。
Sub sample()
' Seleniumのインスタンス生成(お決まり文言)
Dim Driver As New Selenium.WebDriver
Driver.Start "chrome" ' chrome使うからこれ
' 引数に開きたいURLを指定する
Driver.Get "https://suumo.jp/chintai/hyogo/en_JRtokaidohonsen/"
' プルダウンメニューを選択
Dim elm As WebElement
Set elm = Driver.FindElementByCss("#js-shiborikomiForm > div > div.ui-section-body > div.l-refinetable > table > tbody > tr:nth-child(1) > td > div > select:nth-child(1)")
elm.AsSelect.SelectByValue "3.0"
' 表示止めるため
Stop
' 終了処理
Driver.Close
Set Driver = Nothing
End Sub
Indexで選択する場合
WebElement.AsSelect.SelectByIndex index番号
optionタグの何番目かで指定します。上から数えますが、最初は0番目なことに注意です。
3万円以上は1番目になります。
Sub sample()
' Seleniumのインスタンス生成(お決まり文言)
Dim Driver As New Selenium.WebDriver
Driver.Start "chrome" ' chrome使うからこれ
' 引数に開きたいURLを指定する
Driver.Get "https://suumo.jp/chintai/hyogo/en_JRtokaidohonsen/"
' プルダウンメニューを選択
Dim elm As WebElement
Set elm = Driver.FindElementByCss("#js-shiborikomiForm > div > div.ui-section-body > div.l-refinetable > table > tbody > tr:nth-child(1) > td > div > select:nth-child(1)")
elm.AsSelect.SelectByIndex 1
' 表示止めるため
Stop
' 終了処理
Driver.Close
Set Driver = Nothing
End Sub
要素を取得する(複数)
実際にWEBサイトを操作していると、要素の取得時に一発で取得出来ないことも沢山出てきます。
その場合、同じ条件(Class名やタグ名)に該当する複数の要素を一気に取得して、取得したあとループなどで回して、必要な要素を特定していくという作業を行います。
複数の要素を取得する場合は、FindElementBy~をFindElementsBy~と複数系にします。
- FindElementsByClass
- FindElementsByCss
- FindElementsById
- FindElementsByName
- FindElementsByTag
- FindElementsByXPath
また、型も複数系になりますので、
Dim elms as WebElements
みたいな感じになります。
それでは例として、Yahooのトップページから、<a>タグを全部とって、見えているところが「トラベル」になっているタグを取得してみましょう。
まずは、全てのaタグをWebElementsとして取得して、表示上のテキスト表示をイミディエイトウィンドウに出してみます。
Sub sample()
' Seleniumのインスタンス生成(お決まり文言)
Dim Driver As New Selenium.WebDriver
Driver.Start "chrome" ' chrome使うからこれ
' 引数に開きたいURLを指定する
Driver.Get "https://www.yahoo.co.jp/"
' <a>タグを全部取得
Dim elms As WebElements
Set elms = Driver.FindElementsByTag("a")
'中身を書き出し
Dim e As Variant
For Each e In elms
Debug.Print e.Text 'イミディエイトウィンドウに書き出し
Next
' 終了処理
Driver.Close
Set Driver = Nothing
End Sub
実行結果は次です
ちなみに、イミディエイトウィンドウに書き出すところで出てきている以下は、テキストの取得が出来る命令です。
WebElement.Text
指定のテキストが、見つかったらその要素を取得するには、For EachのところをIF分に修正すればOKですね(^^)
※トラベル複数あるので、最初に一致するものがあったらループを抜けるように処理しました。雑ですいません、ホントはもう少し絞り込んでからのが、、、
Sub sample()
' Seleniumのインスタンス生成(お決まり文言)
Dim Driver As New Selenium.WebDriver
Driver.Start "chrome" ' chrome使うからこれ
' 引数に開きたいURLを指定する
Driver.Get "https://www.yahoo.co.jp/"
' <a>タグを全部取得
Dim elms As WebElements
Set elms = Driver.FindElementsByTag("a")
'トラベルが見つかっらた、取得する
Dim e As Variant
Dim elm As WebElement '見つかったらこの変数に入れる
For Each e In elms
'テキストがトラベルだったら変数に入れる
If e.Text = "トラベル" Then
Set elm = e
Exit For '見つかったらループを抜ける
End If
Next
' 終了処理
Driver.Close
Set Driver = Nothing
End Sub
これでOKです!
見つかった要素をクリックするなり、テキストボックスなら文字を入力するなり、ボタンなら押すなりなんなりしてください。
まとめ
SeleniumBasicで利用出来る基本的な命令を紹介しました!基本的な命令ですが、多分これでかなりのことが出来ます(^^) 後はサイトの作りや操作の順番を整理してコツコツ組んで行くだけです!
コメント