【VBA/Selenium】ブラウザウィンドウの特殊操作について

みなさんこんにちは。

Webスクレピングでブラウザウィンドウを操作する際、

最大化や、ウィンドウの切り替えなどが必要とされる局面に出くわすことが多々あるかと思います。

ウィンドウ切り替えについては、特定のリンクをクリックする際、

新たにウィンドウが立ち上がり、そちらに対してスクレイピングを実施したり、

元のウィンドウにフォーカスを切り替えて操作したりする必要があります。

手作業で操作している場合は、「Tab + Alt」でウィンドウを切り替えて

作業することがありますが、

Seleniumではきちんとプログラムをして、ウィンドウの切り替えを指定する必要があります。

今回は、指定したウィンドウの切り替えやウィンドウの操作について網羅的に解説したいと思います。

この記事はこんな人におすすめ

この記事はこんな人におすすめです!

  • VBAプログラミング:初級者~中級者
  • Webスクレイピング:初級者~中級者
  • コードだけサクッと取得したい人
  • 効率の良いコードを書きたい人

といったところでしょうか。

Seleniumに関する過去の記事

Seleniumに関する小ワザやテクニック、Xpathに関する処理については過去の記事でもご紹介しております。

今回の記事を読むメリット

ウィンドウ操作について学ぶことは以下のメリットがあります。

  • 予期せぬエラーの回避
  • Webスクレイピングの基本が定着する
  • ウィンドウ操作に関する網羅的なコード取得

といったところでしょうか。

スクレイピングを数多く実施していると誰しもが経験するカベかと思います。

且つ忘れたころに直面するかと思いますので、

一度やり方を覚えてしまえばかなり有効的なスキルになるかと思います。

ウィンドウの移動

新規タブへドライバー移動

概要説明

ウィンドウ操作の基本であるウィンドウの移動について解説します。

実際にGoogleChromeでリンクテキストをCtrlキーを押しながらClickすると、新規タブでリンクを開く事ができます。

あるいは、右クリックをしてコンテキストメニューを表示する動作としては、

「ホームページを開く」⇒「新規タブを生成」⇒「新規タブへドライバーを移動」という流れになります。

この「新規タブへドライバーを移動する」というプロセスを経なければ、たとえ新規タブをいくらしても新規タブの操作はできません。

操作対象は、初回にdriver.Getしたホームページになってしまいます。

POINT

新規タブをドライバーの操作対象にする場合は、SwitchToNextWindowメソッドを利用します

コード紹介

Private Sub Windows_Open_New_Tab()
    Dim Keys As New Keys
    Dim driver As New ChromeDriver
    Dim elm As WebElement
        with driver
            .Get "ここにアクセスするURLを入力します。"
            Set elm = .FindElementByLinkText("ここにアクセスするリンクを入力します。")
            .Wait 2000
            elm.Click Keys.Control
            .Wait 2000
            .SwitchToNextWindow
            .Wait 2000
            Stop
            .Quit
        end with
End Sub

コード解説

スクロールできます
行数  概要              効果
6行目「ホームページを開く」Getメソッドを使用してアクセスしたいホームページを開きます。
9行目「新規タブを生成」「新規タブを生成」します。FindElementByLinkTextでリンクテキストの”アクセスしたいリンク名”を取得後、Ctrl+Clickしてリンク先を新規タブで開きます。ここでは、新規タブはバックグラウンドで開いています。
11行目「新規タブへドライバーを移動」SwitchToNextWindowメソッドにて新規タブ(右隣り)のウィンドウにドライバーを移動します。これで、スクレイピングの対象がリンクページに移ります。

SwitchToNextWindowメソッドは、「次のウィンドウへフォーカスを移す」という意味です。

ウィンドウ生成順にウィンドウを移動していきます。

ここで、もう一回SwitchToNextWindowメソッドを実行すると、右隣りに新規タブは無い状態ですので、

最初のホームページトップのタブへ移動します。

一つ前のタブへドライバー移動

概要説明

以下の手順について説明します。 

「ホームページを開く」⇒「新規タブを生成」⇒「新規タブへドライバーを移動」⇒「一つ前のドライバーへ移動」

POINT

一つ前のタブにドライバー移動する場合は、SwitchToPreviousWindowメソッドを利用します。

コード紹介

Private Sub Window_NewTab_PreTab()
    Dim Keys As New Keys
    Dim driver As New ChromeDriver
    Dim elm As WebElement
    with driver
        .Get "ここにアクセスするURLを入力します。"
        Set elm = .FindElementByLinkText("ここにアクセスするリンクを入力します。")
        .Wait 2000
        elm.Click Keys.Control
        .Wait 2000
        .SwitchToNextWindow
        .Wait 2000
        .SwitchToPreviousWindow
        .Wait 2000
        .Quit
    end with
End Sub

コード解説

スクロールできます
行数  概要              効果
6行目「ホームページを開く」Getメソッドを使用してアクセスしたいホームページを開きます。
9行目「新規タブを生成」「新規タブを生成」します。FindElementByLinkTextでリンクテキストの”アクセスしたいリンク名”を取得後、Ctrl+Clickしてリンク先を新規タブで開きます。ここでは、新規タブはバックグラウンドで開いています。
11行目「新規タブへドライバーを移動」SwitchToNextWindowメソッドにて新規タブ(右隣り)のウィンドウにドライバーを移動します。これで、スクレイピングの対象がリンクページに移ります。
13行目「一つ前のドライバーへ移動」SwitchToPreviousWindowメソッドで一つ前のタブ(左隣り)のウィンドウにドライバーを移動します。これで、スクレイピングの対象が最初の画面に移ります。

SwitchToPreviousWindowメソッドは、「一つ前のウィンドウへフォーカスを移す」という意味です。

SwitchToPreviousWindowを設定しなければ、ウィンドウ操作の対象が移らず、最初に表示した画面からドライバーがひとつ前のウィンドウに移ることができません。

ウィンドウタイトルでドライバー移動

概要説明

おそらくこの操作が多く使用されるのではないかと思っております。

今までウィンドウ移動は、タブ(ウィンドウ)生成順に前後を移動させるメソッドを2例(SwitchToNextWindow, SwitchToPreviousWindow)で解説しました。

ここでは、移動したいウィンドウタイトルがあらかじめ分かっている場合、ウィンドウタイトルを指定してウィンドウを移動させることができます。

 「ホームページを開く」⇒「ウィンドウタイトルの取得」⇒「新規タブを生成」⇒「新規タブへドライバーを移動」⇒「ウィンドウタイトルを指定してドライバー移動」という動作を解説します。

POINT

ウィンドウタイトルを指定ドライバー移動する場合は、SwitchToWindowByTitleメソッドを利用します。

コード紹介

Private Sub WindowTitle_Switch()
    Dim Keys As New Keys
    Dim driver As New ChromeDriver
    with driver
        .Get "ここにアクセスするリンクを入力します。"
        Dim WinTitle As String
        WinTitle =.Window.Title
        Debug.Print WinTitle
        Dim elm As WebElement
        Set elm = .FindElementByLinkText("ここにアクセスするURLを入力します。")
        .Wait 2000
        elm.Click Keys.Control
        .Wait 2000
        .SwitchToNextWindow
        .Wait 2000
        .SwitchToWindowByTitle WinTitle
        .Wait 2000
        .Quit
    end with
End Sub

コード解説

スクロールできます
行数   概要        効果
5行目「ホームページを開く」Getメソッドを使用してアクセスしたいホームページを開きます。
6、7行目「ウィンドウタイトルの取得」WinTitle変数にウィンドウタイトルを代入します。ウィンドウタイトルは、WindowクラスのTitleプロパティで取得することができます。
12行目「新規タブを生成」「新規タブを生成」します。FindElementByLinkTextでリンクテキストの”アクセスしたいリンク名”を取得後、Ctrl+Clickしてリンク先を新規タブで開きます。ここでは、新規タブはバックグラウンドで開いています。
14行目「新規タブへドライバーを移動」SwitchToPreviousWindowメソッドで新規タブ(右隣り)のウィンドウにドライバーを移動します。これで、スクレイピングの対象がリンクページに移ります。
16行目「ウィンドウタイトルを指定してドライバー移動」SwitchToPreviousWindowメソッドで一つ前のタブ(左隣り)のウィンドウにドライバーを移動します。これで、スクレイピングの対象が最初の画面に移ります。

ウィンドウサイズの変更

Seleniumで立ち上げたChromeブラウザのウィンドウサイズを変更する方法を解説します。

構文はChromeDriverクラス配下のWindowクラスを利用します。

ウィンドウサイズの最大化

概要説明

取得したドライバーのウィンドウサイズを最大化させる構文の紹介です。

SeleniumBaisicでWebスクレイピングをする際、

Web要素の取得やクリック動作でエラー発生する際、ウィンドウサイズが小さい場合があります。

ウィンドウサイズを最大化することによってエラーの頻度を抑えることができます。

コード紹介

Private Sub Window_Maximize()
    Dim driver As New ChromeDriver
    with driver 
        .Get "about:blank"
        .Window.Maximize
        Stop
        .Quit
    end with
End Sub

ウィンドウサイズの指定

概要説明

取得したドライバーのウィンドウを非表示にします。

ウィンドウを表示しない分、処理が早くなるので表示したサイト内の情報を取得したい時などに有効です。

ただし、ボタンクリックやテキスト入力などの操作が必要な場合はエラーになってしまうので注意が必要です。

コード紹介

Private Sub BrowserStartUp()
    Dim driver As New ChromeDriver
    with driver
        .Get "about:blank"
        .Window.Maximize
        .AddArgument "headless" '■ブラウザ表示を非表示にする
        Stop
        .Quit
    end with
End Sub

最後に

いかがでしたでしょうか。

Seleniumを使用していると予測不能な謎エラーに遭遇することが多々あります。

ですので、しっかりマスターして基本を抑えながらと実装できると業務効率も格段に向上するかと思います。

そのきっかけとして、少しでも参考になればと思います。

開発依頼について

ココナラでWebスクレイピング開発サービスを出品しております。

自分で開発をしようと思ったけど、依頼したり、何か聞きたいことがあったりしたら

いつでもお気軽にご相談ください。

また、本ブログからご依頼いただいた方については割引特典がございますので、

ご不明点と合わせてメッセージをいただけると幸いです。

Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!

Webスクレイピング以外にもWebアプリの開発サービスも出品しております。

こちらについても、本ブログからご依頼ただいた方については割引特典がございますので、

ご不明点と合わせてメッセージいただけると幸いです。

スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?

ご興味がある方はこちら!!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA