SeleniumBasicでホームページを開き、リンクテキストをクリックする操作はウェブスクレイピングではよくある動作になります。そこで、今回はSeleniumBaisicの操作(基礎編)第6回目として、下図Web操作フロー図の中の「ウィンドウの操作」について解説していきます。
 本記事では、SeleniumBasicの操作(基礎編)第6回の内容と共に、SeleniumBasicのExmaples.xlsmにあるusage_windowの解説を兼ねています。
| ブラウザの起動 | 
| Web操作 | 
| ブラウザを閉じる | 
| Web要素のキャッチ | 
| ウィンドウの操作 | 
| フレームの移動 | 
| スクリーンショットの取得 | 
| HTML情報の取得 | 
| Cookie情報取得 | 
| クリック | 
| 文字列入力 | 
| チェックボックス操作 | 
| ドラッグアンドドロップ | 
| ドロップダウンリスト選択 | 
| ダイアログボックスの操作 | 
| テーブルデータの取得 | 
| ファイルダウンロード | 
| Web要素のプロパティ取得 | 
マクロファイル ダウンロード
このページで掲載しているVBAのマクロファイルを以下リンクからダウンロードできます。必要に応じてファイルダウンロードして活用ください。
ダウンロードファイルのマクロ実行注意事項(ここをクリック)
ファイルダウンロード後、マクロ実行するまでの注意事項を記載しておきます。
マクロファイルを実行するには、事前にSeleniumBasicをインストールしておく必要があります。同時にChromeDriverを現在のChromeブラウザのバージョンに合わせて更新しておきます。SeleniumBasicのインストールとChromeDriverの更新については以下記事を参照ください。

マクロファイルを開き、「コンテンツの有効化」をクリックします。

Web上からダウンロードしたマクロファイルはデフォルトで実行できない様に設定されています。ダウンロードしたマクロファイルを開いて以下の様に(このファイルのソースが信頼できないため、Microsoftによりマクロの実行がブロックされました。)表示される場合はファイルプロパティを変更します。

ファイルプロパティを開いて、セキュリティ項目の「許可する」にチェックを入れ、「OK」をクリックする。

VBE(Visual Basic Editor)画面の参照設定を開き、「Selenium Type library」にチェックを入れて、OKをクリックします。

一度ファイルを閉じて、再度ファイルを開き、「コンテンツの有効化」をクリックします。その後、マクロ実行します。ダウンロードファイルは基本的に実行ボタンを実装していませんので、マクロファイルを実行するには、VBEを開き、デバッグ実行によって、スクリプト実行します。

Excelファイルを開いた後、Alt + F11にてVBEエディタを開き、該当のプロシージャまでカーソル移動して、F5にてデバッグ実行します。
ウィンドウの移動
ウィンドウ操作の基本であるウィンドウの移動について解説します。
新規タブへドライバー移動
概要
 ChromeでリンクテキストをCtrlキーを押しながらClickすると、新規タブでリンクを開く事ができます。詳しくは、第4回講座(Web用をクリック)で解説しています。
 動作としては、「ホームページを開く」⇒「新規タブを生成」⇒「新規タブへドライバーを移動」という流れになります。この「新規タブへドライバーを移動する」というプロセスを経なければ、たとえ新規タブをいくらしても新規タブの操作はできません。操作対象は、初回にdriver.Getしたホームページになってしまいます。
新規タブをドライバーの操作対象にする場合は、SwitchToNextWindowメソッドを利用します。
VBA構文
Private Sub Windows_Open_New_Tab()
    Dim Keys As New Keys
    Dim driver As New ChromeDriver
    driver.Get "https://www.google.co.jp"
    Dim elm As WebElement
    Set elm = driver.FindElementByLinkText("Googleについて")
    driver.Wait 2000
    elm.Click Keys.Control
    driver.Wait 2000
    driver.SwitchToNextWindow
    driver.Wait 2000
    Stop
    driver.Quit
End Subコード解説
コードの動作を解説します。画像イメージを見る場合は、各項目の「∨」をクリックしてください。
- 4行目「ホームページを開く」
 - 
GetメソッドにてGoogleホームページを開きます。

 - 8行目「新規タブを生成」
 - 
FindElementByLinkTextでリンクテキストの"Googleについて"を取得後、Ctrl+Clickしてリンク先を新規タブで開きます。ここでは、新規タブはバックグラウンドで開いています。

 - 10行目「新規タブへドライバーを移動」
 - 
SwitchToNextWindowメソッドにて新規タブ(右隣り)のウィンドウにドライバーを移動。これで、スクレイピングの対象がリンクページに移ります。

 
SwitchToNextWindowメソッドは、「次のウィンドウへフォーカスを移す」という意味です。ウィンドウ生成順にウィンドウを移動していきます。ここで、もう一回SwitchToNextWindowメソッドを実行すると、右隣りに新規タブは無い状態ですので、最初のGoogleホームページトップのタブへ移動します。
一つ前のタブへドライバー移動
概要
「ホームページを開く」⇒「新規タブを生成」⇒「新規タブへドライバーを移動」⇒「一つ前のドライバーへ移動」という動作を解説します。
一つ前のタブにドライバー移動する場合は、SwitchToPreviousWindowメソッドを利用します。
VBA構文
Private Sub Window_NewTab_PreTab()
    Dim Keys As New Keys
    Dim driver As New ChromeDriver
    driver.Get "https://www.google.co.jp"
    Dim elm As WebElement
    Set elm = driver.FindElementByLinkText("Googleについて")
    driver.Wait 2000
    elm.Click Keys.Control
    driver.Wait 2000
    driver.SwitchToNextWindow
    driver.Wait 2000
    driver.SwitchToPreviousWindow
    driver.Wait 2000
    driver.Quit
End Subコード解説
コードの動作を解説します。画像イメージを見る場合は、各項目の「∨」をクリックしてください。
- 4行目「ホームページを開く」
 - 
GetメソッドにてGoogleホームページを開きます。

 - 8行目「新規タブを生成」
 - 
FindElementByLinkTextでリンクテキストの"Googleについて"を取得後、Ctrl+Clickしてリンク先を新規タブで開きます。ここでは、新規タブはバックグラウンドで開いています。

 - 10行目「新規タブへドライバーを移動」
 - 
SwitchToNextWindowメソッドにて新規タブ(右隣り)のウィンドウにドライバーを移動。これで、スクレイピングの対象がリンクページに移ります。

 - 12行目「一つ前のドライバーへ移動」
 - 
SwitchToPreviousWindowメソッドで一つ前のタブ(左隣り)のウィンドウにドライバーを移動します。これで、スクレイピングの対象がGoogleホーム画面に移ります。

 
 SwitchToPreviousWindowメソッドは、「一つ前のウィンドウへフォーカスを移す」という意味です。
SwitchToPreviousWindowを設定しなければ、ウィンドウ操作の対象が移らず、「Googleについて」の画面からドライバーがGoogleホームページに移ることができません。
ウィンドウタイトルでドライバー移動
概要
 ウィンドウ移動は、タブ(ウィンドウ)生成順に前後を移動させるメソッドを上記2例(SwitchToNextWindow, SwitchToPreviousWindow)で解説しました。ここでは、移動したいウィンドウタイトルがあらかじめ分かっている場合、ウィンドウタイトルを指定してウィンドウを移動させることができます。
 「ホームページを開く」⇒「ウィンドウタイトルの取得」⇒「新規タブを生成」⇒「新規タブへドライバーを移動」⇒「ウィンドウタイトルを指定してドライバー移動」という動作を解説します。
ウィンドウタイトルを指定ドライバー移動する場合は、SwitchToWindowByTitleメソッドを利用します。
VBA構文
Private Sub WindowTitle_Switch()
    Dim Keys As New Keys
    Dim driver As New ChromeDriver
    driver.Get "https://www.google.co.jp"
    Dim WinTitle As String
    WinTitle = driver.Window.Title
    Debug.Print WinTitle
    Dim elm As WebElement
    Set elm = driver.FindElementByLinkText("Googleについて")
    driver.Wait 2000
    elm.Click Keys.Control
    driver.Wait 2000
    driver.SwitchToNextWindow
    driver.Wait 2000
    driver.SwitchToWindowByTitle WinTitle
    driver.Wait 2000
    driver.Quit
End Subコード解説
コードの動作を解説します。画像イメージを見る場合は、各項目の「∨」をクリックしてください。
- 4行目「ホームページを開く」
 - 
GetメソッドにてGoogleホームページを開きます。

 - 5,6行目「ウィンドウタイトルの取得」
 - 
WinTitle変数にウィンドウタイトルを代入します。ウィンドウタイトルは、WindowクラスのTitleプロパティで取得することができます。Googleホームページのウィンドウタイトルは、「Google」となります。
 - 11行目「新規タブを生成」
 - 
FindElementByLinkTextでリンクテキストの"Googleについて"を取得後、Ctrl+Clickしてリンク先を新規タブで開きます。ここでは、新規タブはバックグラウンドで開いています。

 - 13行目「新規タブへドライバーを移動」
 - 
SwitchToNextWindowメソッドにて新規タブ(右隣り)のウィンドウにドライバーを移動。これで、スクレイピングの対象がリンクページに移ります。

 - 15行目「ウィンドウタイトルを指定してドライバー移動」
 - 
SwitchToWindowByTitleメソッドでウィンドウタイトル(Google)を指定してドライバーを移動します。これで、スクレイピングの対象がGoogleホーム画面に移ります。

 
ウィンドウサイズの変更
Seleniumで立ち上げたChromeブラウザのウィンドウサイズを変更する方法を解説します。構文はChromeDriverクラス配下のWindowクラスを利用します。
ウィンドウサイズ最大化
取得したドライバーのウィンドウサイズを最大化させる構文の紹介です。SeleniumBaisicでWebスクレイピングをする際、Web要素の取得やクリック動作でエラー発生する際、ウィンドウサイズが小さい場合があります。ウィンドウサイズを最大化することによってエラーの頻度を抑えることができます。
Private Sub Window_Maximize()
    Dim driver As New ChromeDriver
    driver.Get "about:blank"
    driver.Window.Maximize
    Stop
    driver.Quit
End Sub- 4行目
 - 
Window.Maximizeメソッドにて画面最大化
 
ウィンドウサイズの指定
取得したドライバーのウィンドウサイズを横、縦のサイズ値で指定します。ウィンドウサイズはとりあえず最大化しておけばエラー回避できますので、ここで解説しているウィンドウサイズを指定するメソッドは特に覚える必要はありません。ウィンドウのスナップショットを撮りたい場合なんかでは役に立つと思います。
Private Sub Window_SetSize()
    Dim driver As New ChromeDriver
    driver.Get "about:blank"
    driver.Window.SetSize 800, 600
    Stop
    driver.Quit
End Sub- 4行目
 - 
Window.SetSizeメソッドでウィンドウサイズを指定(横:800、縦:600)
 
usage_window解説
ここでは、usage_windowに掲載されているウィンドウ操作の構文例を紹介しています。基礎講座としては特に習得する必要のない内容になります。また、あまり利用する機会も無い構文ですので特に読み飛ばしてもらって構いません。
新しく開いたウィンドウを閉じる
メインウィンドウを事前に設定しておき、メインウィンドウ以外のウィンドウを全て閉じる構文を紹介します。
Private Sub Windows_Close()
    Dim driver As New ChromeDriver
    driver.Get "https://the-internet.herokuapp.com/windows"
    Dim winMain As Selenium.Window
    Set winMain = driver.Window
    driver.FindElementByLinkText("Click Here").Click
    Stop
    Dim win As Selenium.Window
    For Each win In driver.Windows
        If Not win.Equals(winMain) Then win.Close
    Next win
    winMain.Activate
    Stop
    driver.Quit
End Sub- 4,5行目
 - 
メインウィンドウを設定
 - 6行目
 - 
FindElementByLinkTextでリンクテキストの"Click Here"を取得してクリック
 - 8行目
 - 
win変数宣言
 - 9,11行目
 - 
driver.WindowsでChromeDriverにて取得しているウィンドウ全てからFor Eachで各ウィンドウをループ
 - 10行目
 - 
4,5行目で設定したメインウィンドウ以外をwin.Closeメソッドで閉じる
 - 12行目
 - 
メインウィンドウをアクティブ状態にする
 
ウィンドウ移動の確認
ウィンドウ移動をする前にウィンドウタイトルを確認する構文の紹介です。あらかじめ、ウィンドウタイトルが分かっていることが前提です。
Private Sub Windows_Switch()
    Dim Assert As New Selenium.Assert
    Dim driver As New ChromeDriver
    driver.Get "https://the-internet.herokuapp.com/windows"
    driver.FindElementByLinkText("Click Here").Click
    Stop
    driver.SwitchToNextWindow
    Assert.Equals "New Window", driver.Title
    driver.SwitchToPreviousWindow
    Assert.NotEquals "New Window", driver.Title
    driver.Quit
End Sub- 5行目
 - 
FindElementByLinkTextにてリンクテキスト"Click Here"をクリック
 - 7行目
 - 
新規タブのウィンドウにドライバーを移動
 - 8行目
 - 
Assert.Equalsでドライバータイトル名を確認
 - 9行目
 - 
一つ前のウィンドウ(最初に立ち上げたタブ)にドライバーを移動
 - 10行目
 - 
現在のウィンドウが新規タブでないことを確認
 
JavaScriptによる新規タブの生成
JavaScriptの構文を利用し、新規タブを追加する方法を紹介します。
Private Sub Windows_Open_New_One2()
    Dim driver As New ChromeDriver, Keys As New Keys
    driver.Get "about:blank"
    driver.ExecuteScript "window.open(arguments[0])", "https://www.google.com/"
    driver.SwitchToNextWindow
    Stop
    driver.Quit
End Sub- 3行目
 - 
ドライバー取得。空白のページを生成。
 - 4行目
 - 
JavaScriptで新規タブにてGoogleホームページを取得
 - 5行目
 - 
新規タブにウィンドウを移動
 



