【EXCEL VBA | ノート】WEBブラウザを自動操作する!Selenium Basicの使い方!その1(Chrome編)

スポンサーリンク

SeleniumBasicの始め方

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で利用出来る基本的な命令を紹介しました!基本的な命令ですが、多分これでかなりのことが出来ます(^^) 後はサイトの作りや操作の順番を整理してコツコツ組んで行くだけです!

続き