pythonのseleniumにてブラウザ操作をしていた時にちょっとひっかかったことがあったので備忘録として記載しておきます。
あくまでも一つの例になります。
ブラウザ操作をしていた時なのですが、ボタンクリックにより繰り返し新規画面を出しながらそれぞれの画面へデータ入力を行っていくような操作をseleniumを使用して自動でやらせる処理の作成を行っていました。
driverのwindowhandlesを確認しながら次の画面にcurrethandleを移動させてというようなことを繰り返し行っていたつもりだったのですが、何回やっても2,3画面目にあたりで新規画面にデータを書き込んでくれずに元の画面などに上書きしてしまうという現象が起こっていました。
はじめは原因が分からなかったのですが、試行錯誤していろいろと調べたり試したりしているうちにようやく原因がわかりました。
結果的には思い込みというのはちょっとこわいという内容でした。
元々は、新しく開いたウインドウのハンドルというのは必ずdriverのwindowhandlesの末尾に追加されるものだと思っていたためウインドウを開くたびに以下のように末尾のハンドルに移動としていました([-1]は末尾のハンドルを取得)。
# 新規ウィンドウが表示された場合、最後に開いたのウィンドウをアクティブにする driver.switch_to_window(browser.window_handles[-1])
しかしながら、実際には新規ウインドウのハンドルは、windowhandles内のランダムの場所に追加されるようでした。
そのため新規にウインドウを開いた時にそのウインドウを選択する場合には、末尾のハンドルの選択ではだめでした。
実際にうまくいったやり方としては、ウインドウオープン用のボタンをクリックする前に一度windowhandlesを取得、記憶しておき、クリック後に再度windowhandlesを取得し、クリック前のwindowhandlesと比較してクリック前のwindowhandlesになかったものを選択というような処理を行うことで改善しました。
windowhandles自体が配列型ではなくリスト型?なのでこういうことになるんですかね。
ちょっとひっかかりました。
関連記事:
【selenium 備忘録】ボタンクリックで複数の新規ウインドウを開いた時新規ウインドウをアクティブにできなかった場合の対処方法例 - Django Girls and Boys 備忘録
【python】実行ファイル(EXEファイル)作成手順 - Django Girls and Boys 備忘録
【Python カレントディレクトリ取得】Excelファイル指定を使った簡単な例記載 - Django Girls and Boys 備忘録
【Pythonでopenpyxlを使用したExcelファイルの読み書き方法】xlsmファイル(マクロありファイル)の場合 - Django Girls and Boys 備忘録
【PythonでのExcelファイル読み書き方法】ファイルオープンしているファイル(アクティブファイル)への書込方法 - Django Girls and Boys 備忘録
【Python Selenium】Webサイトのスクレイピングなどで必要なフレーム間移動方法 - Django Girls and Boys 備忘録
【Python Selenium】Webサイトのスクレイピングなどで必要なフレーム間移動方法 - Django Girls and Boys 備忘録
【PythonからWeb操作】selenium、各ブラウザ用ドライバーの最新バージョン確認、ダウンロード場所 - Django Girls and Boys 備忘録
【Python Selenium】ブラウザ用ドライバーのダウンロードとインストール - Django Girls and Boys 備忘録
【Python Selenium】ブラウザ用ドライバーのインストール、設定とWebサイトへのアクセス方法 - Django Girls and Boys 備忘録