【Excel VBA×Selenium】NoSuchWindowエラーの原因と対処法|閉じたタブを操作してしまう場合

みなさんこんにちは。

Excel VBAとSeleniumで複数のタブを操作していると、NoSuchWindowやno such windowというエラーが表示されることがあります。

今回は、閉じたタブを操作してしまう原因と、操作対象を元のタブに戻す方法についてご紹介したいと思います。

NoSuchWindowエラーが発生する原因

SeleniumはChromeで見えているタブと、VBAが操作対象にしているタブを別々に管理します。Closeでタブを閉じたあと、切り替えずにTitleなどを取得するとエラーになる場合があります。

Excel VBAとSeleniumBasicで閉じたタブを操作した際にNoSuchWindowエラーが発生した画面

SeleniumBasicでタブの一覧を確認する

通常のSeleniumでいうWindowHandlesに相当する機能は、SeleniumBasicではdriver.Windowsです。driver.Windows.Countで開いているタブ数を確認できます。

また、driver.Windowで現在のタブを保存でき、Window.Activateで切り替えられます。

Close後に正しいタブへ切り替えるコード

VBAの参照設定で「Selenium Type Library」を有効にし、標準モジュールへ次のコードを入力してください。新しいタブを開いて閉じ、残ったタブへ切り替える例となります。

Option Explicit

Sub CheckWindowAfterClose()
    Dim driver As New Selenium.ChromeDriver
    Dim firstWindow As Selenium.Window
    Dim remainingWindow As Selenium.Window

    On Error GoTo ErrHandler

    'Chromeを起動し、最初のタブを保存する
    driver.Start "chrome"
    driver.Get "about:blank"
    Set firstWindow = driver.Window

    '2枚目のタブを開き、操作対象を切り替える
    driver.ExecuteScript "window.open('about:blank','_blank');"
    driver.SwitchToNextWindow 5000
    Debug.Print "Close前:" & driver.Windows.Count & "タブ"

    '現在操作している2枚目のタブを閉じる
    driver.Close

    'タブ一覧を取得し直し、元のタブに戻す
    Debug.Print "Close後:" & driver.Windows.Count & "タブ"
    If driver.Windows.Count = 0 Then GoTo CleanUp
    Set remainingWindow = driver.Windows.Get(1)
    remainingWindow.Activate
    Debug.Print "切替後のURL:" & driver.Url

CleanUp:
    driver.Quit
    Exit Sub

ErrHandler:
    Debug.Print "エラー:" & Err.Number & " " & Err.Description
    On Error Resume Next
    driver.Quit
End Sub
Excel VBAとSeleniumBasicでWindowsとActivateを使い閉じたタブから残っているタブへ切り替えるコード

エラーの再現と実行結果

エラーを確認したい場合は、上記コードのdriver.Closeの直後に、一時的に次の行を追加してください。エラーハンドラーが内容をイミディエイトウィンドウへ出力します。撮影後は追加行を削除してね。

'エラーを確認するときのみ、driver.Closeの直後に追加
Debug.Print driver.Title

通常のコードを実行すると、イミディエイトウィンドウ(Ctrl + G)には次のように表示される想定です。

Close前:2タブ
Close後:1タブ
切替後のURL:about:blank

再取得と注意点

Windows.Get(1)は残りのタブが1枚の場合の例です。SeleniumBasicのListはVBAから参照すると1始まりとなります。複数タブが残る場合は、閉じる前に保存したfirstWindowをfirstWindow.Activateで復帰させる方法がおすすめよ。

なお、タブを切り替えたあとは、新しいタブのDOMに合わせてFindElementなどで要素を取得し直してください。閉じたタブのWebElementは再利用しないようにしましょう。

最後に

いかがでしたでしょうか。NoSuchWindowが発生した場合は、タブが残っているか確認し、Close後に操作対象を切り替えることが大切です。少しでも参考になれば幸いです。

開発依頼について

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

自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。

そんな方はいつでもお気軽にご相談ください。

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

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

業務の流れをまるごと自動化します Excel・Web・Teams・SaaSで業務全体を自動化

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

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

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

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

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

コメントを残す

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

CAPTCHA