SeleniumBasicの操作(基礎編)第6回:ウィンドウの操作(usage_window)

リファレンス

 SeleniumBasicでホームページを開き、リンクテキストをクリックする操作はウェブスクレイピングではよくある動作になります。そこで、今回はSeleniumBaisicの操作(基礎編)第6回目として、下図Web操作フロー図の中の「ウィンドウの操作」について解説していきます。
 本記事では、SeleniumBasicの操作(基礎編)第6回の内容と共に、SeleniumBasicのExmaples.xlsmにあるusage_windowの解説を兼ねています。

スクロールできます
ブラウザの起動
Web操作
ブラウザを閉じる

Web要素のキャッチ
ウィンドウの操作
フレームの移動
スクリーンショットの取得
HTML情報の取得
Cookie情報取得
(Web操作の代表的な操作例)

クリック
文字列入力
チェックボックス操作
ドラッグアンドドロップ
ドロップダウンリスト選択
ダイアログボックスの操作
テーブルデータの取得
ファイルダウンロード
Web要素のプロパティ取得
(Web要素キャッチ後のメソッド例)
目次

マクロファイル ダウンロード

 このページで掲載しているVBAのマクロファイルを以下リンクからダウンロードできます。必要に応じてファイルダウンロードして活用ください。

ダウンロードファイルのマクロ実行注意事項(ここをクリック)

 ファイルダウンロード後、マクロ実行するまでの注意事項を記載しておきます。

STEP
SeleniumBasicのインストール、ChromeDriverの更新

 マクロファイルを実行するには、事前にSeleniumBasicをインストールしておく必要があります。同時にChromeDriverを現在のChromeブラウザのバージョンに合わせて更新しておきます。SeleniumBasicのインストールとChromeDriverの更新については以下記事を参照ください。

STEP
コンテンツの有効化

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

STEP
セキュリティ リスク設定の確認

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

STEP
ファイルプロパティの変更

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

STEP
Selenium Type libraryのチェック

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

STEP
デバッグ実行

 一度ファイルを閉じて、再度ファイルを開き、「コンテンツの有効化」をクリックします。その後、マクロ実行します。ダウンロードファイルは基本的に実行ボタンを実装していませんので、マクロファイルを実行するには、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行目

新規タブにウィンドウを移動

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

VBAを中心とした自動化、効率化の手法を紹介しています。現在は、SeleniumBasicのexamplesを紹介しています。その内、SeleniumBasic以外の手法も掲載したいと思っております。

目次