注意:何がどう上手く行かないかの整理まではしましたが、解決まで辿り着いていません。
##環境
Selenium Webdriver 言語はruby、ブラウザはgoogle chrome。
余談だが、Seleniumで困って検索すると「Seleniumの種類は色々あるが、どのSeleniumについての話か」「Webdriverだとして、使用言語は何か」「ブラウザは何か」がバラバラで結構手間取る。自分はrubyでやろうとしてるけど、このサイトの記述は違う言語だ、みたいなことがよく起きる。つらい。
#やりたい処理、当初の期待
Seleniumを使ってデータを収集・スクレイピングしようとしていた。対象のページでは、JavaScriptのonclickを使って新しいウィンドウがポップアップするようになっている。新たに開かれたページ内の情報を読み込みたい。調べたところ、この形式のウィンドウは「モーダルウィンドウ」または「モーダルダイアログ」という名称らしい。
「Selenium Webdriver モーダルウインドウ」で検索すると、ウィンドウを切り替えて新しいウィンドウにフォーカスする方法が見つかる。
これが一番分かりやすかった。言語はJava。
http://a4dosanddos.hatenablog.com/entry/2014/04/30/001630
driver.getWindowHandle()
で現在のウィンドウのハンドルを取得する。末尾にsが付いたdriver.getWindowHandles()
だとウィンドウのハンドルの一覧を取得する。
rubyだとメソッド名が若干違っている。
http://www.rubydoc.info/gems/selenium-webdriver/0.0.28/Selenium/WebDriver/Driver によれば、メソッド名は以下の通り。
driver = Selenium::WebDriver.for :chrome
driver.window_handle # 現在のウィンドウのハンドルを取得する
driver.window_handles # ハンドル一覧を取得する。返り値はArrayになる
driver.switch_to.window(新しいウィンドウのハンドル) #これでウィンドウが切り替わる
この辺のメソッドを使えばウィンドウの切り替えが実現できそうだ……と期待した。
#検証
簡単なサンプルコードを書いて検証。間に入れたsleepはページ表示などを確実に完了させるためで、深い意味はない。
require 'certified'
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :chrome
driver.navigate.to "https://syncer.jp/jquery-modal-window/demo/modal.html" # URLはモーダルウィンドウのサンプルがあるサイト
sleep 3
driver.find_element(:id, "modal-open").click #idで目的の要素を探してクリック。ウィンドウが開く
sleep 3
p driver.window_handle # -> "CDwindow-c57c9316-cfee-432a-aeac-f705da98ec07"
p driver.window_handles # -> ["CDwindow-c57c9316-cfee-432a-aeac-f705da98ec07"]
p driver.window_handles.length # -> 1
あれ、ウィンドウが2つあるはずなのに1つしか無い。これでは期待した方法ではウィンドウ切り替えできない。失敗だ。
#失敗の原因
上の検証までやって力尽きた……。
調べたら、ChromeではshowModalDialogが削除されているので、そのせいだと思われる。
(削除されているのなら、そもそも何でモーダルウィンドウが見られるのかが疑問だが)
参考:https://www.htmlhifive.com/conts/web/view/pitalium-sample/popup-window
結論:Selenium WebDriverを使ってChromeでテストをし、上記の方法でモーダルウィンドウに切り替えることはできない
対策……ChromeじゃなくてIEならば行けるらしいので、IEを使うのが一つの手。あとは思いつかない……