こんにちは。初めましての人もそうでない人も、
※以下、以前Bloggerに投稿していた記事を移行した内容になります。2020年12月頃に書いた内容なので、chromeに関するエラーなど、最新の状況が変わっている可能性があります。
今日はSeleniumでブラウザを最前面表示させる方法、という小ネタです。
仕事で必要になって調べたのですが、案外いい方法がなくて、最終的に自己解決したので、記事にしておこうかと。
記憶ベースで書いているので、seleniumのバージョンなど細かい情報については、取り急ぎ省略させていただきます。
目次
きっかけはChromeでのクローリングエラー
調べようと思ったきっかけは、クローリングしていたサイトで2020年12月頭頃から出るようになったエラーです。
エラーが出ていた箇所は、マウスポインタを特定のアイコンにフォーカスさせて、JS制御で表示されるダイアログの情報を取得する箇所。
デバッグしながら動かすと、どうやら最前面で表示されている以外のChromeのブラウザが、最前面表示に切り替わるまでロードされていない様子でした。
(ちゃんと検証してないのですが、Chromeのバージョンが変わってから、なんだかそんな動きになったような。ロードもそうですが、JSの制御も最前面表示じゃないとうまく動いてくれなくなりました。
半年以上最前面表示じゃなくともエラー出てなかったのですが、他のサイトでも同じタイミングで似たような事象が起きるようになっていたので、Chromeのバージョンに依存する問題じゃないかなー、と思ってます。)
調べた最前面表示させる方法
そんなわけで、該当の処理を行う間、ブラウザを最前面表示させる方法はないかと調べました。
で、"selenium window 切り替え"などの検索ワードで出てきたのは、
driver.window_handles
を使う方法でした。
ただこの方法だと、複数ブラウザを別スレッドで制御している場合には、使えないんですよね。。。検索ワードを変えても、出てくるのは上記の方法ばかり。。。
自己解決した方法
で、私が考えたのはとても単純な方法。
Python
from selenium import webdriver
from time import sleep
def switch_window(driver: webdriver.Chrome):
driver.minimize_window()
sleep(3)
driver.maximize_window()
これだけです。
要は、ブラウザを最小化してから、最大化表示させるだけ。
最小化が完了しきる前に、最大化の処理が走る場合があってエラーになることがあったので、sleepを入れてます。
私の場合、他のスレッドと同時にこの処理が走ると意味がないので、スレッドをロックする処理も入れてました。まあその辺は今回の本題ではないので、割愛します。
以上、小ネタでした。
-----------------------------------
素材取得元