質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

1回答

1408閲覧

Selenium+Pythonにて、アラートが出る新規ウインドウに遷移したい

gologius

総合スコア17

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2018/05/13 10:07

前提・実現したいこと

リンクをクリックする→新規ウインドウが開く(※ただしウインドウが開くと即アラートが出る)

という動きをSelenium+Pythonで実現したいと考えています。

発生している問題・エラーメッセージ

調べているとどうも

  • アラートを消すためには、アラートが出ているウインドウに遷移しなければならない
  • ウインドウに遷移するためには、アラートを消さなければならない

と、デッドロックみたいな状況になっているようです。

実際には以下のようなサイトです(私がサンプルサイトを構築しました)

https://gologius.github.io/test.html

該当のソースコード

上記のサンプルサイトに対して、自動アクセスするコードです。

python

1# -*- coding: utf-8 -*- 2""" 3Created on Wed Mar 7 22:16:01 2018 4 5@author: 6""" 7 8from selenium import webdriver 9from selenium.webdriver.common.alert import Alert 10from selenium.webdriver.support import expected_conditions 11from selenium.webdriver.support.ui import WebDriverWait 12from selenium.common.exceptions import TimeoutException 13 14import datetime 15import traceback 16 17########################################################################### 18def waitOpenWindow(driver, beforeWinNum, maxWaitSec = 10): 19 """ 20 指定された時間まで、ウインドウが開くのを待つ 21 """ 22 23 beginTime = datetime.datetime.now() 24 endTime = beginTime + datetime.timedelta(seconds=maxWaitSec) 25 26 while(datetime.datetime.now() <= endTime): 27 28 afterWinNum = len(driver.window_handles[-1]) 29 if afterWinNum == beforeWinNum: 30 continue 31 elif afterWinNum > beforeWinNum: 32 #ウインドウ数が増える=新規ウインドウが開いた 33 return True , "指定時間内に新規ウインドウが開きました" 34 else: 35 return False, "ウインドウが外部から閉じられた可能性があります" 36 37 return False, "指定時間内に新規ウインドウが開きませんでした" 38 39########################################################################### 40def waitAlert(driver, maxWaitSec = 10): 41 """ 42 指定された時間まで、アラートが開くのを待つ 43 """ 44 45 try: 46 wait = WebDriverWait(driver, maxWaitSec) 47 wait.until(expected_conditions.alert_is_present()) 48 except TimeoutException as time_e: 49 return 0, "アラート表示待機中にタイムアウトしました" 50 except Exception as e: 51 print(traceback.print_exc) 52 return -1, "アラート表示待機中に予期しないエラーが発生しました" 53 54 return 1, "アラートが表示されています : " + Alert(driver).text 55 56########################################################################### 57#関数定義 58def access(): 59 60 try : 61 print("begin process") 62 63 driver = webdriver.Chrome("chromedriver_win32\chromedriver.exe") 64 driver.implicitly_wait(10) 65 driver.get("https://gologius.github.io/test.html") 66 67 print("画面名", driver.title) 68 winNum = len(driver.window_handles) 69 70 #リンクをクリック 71 driver.find_element_by_link_text("javascriptによる小ウインドウ表示").click() 72 73 #ウインドウ表示待機 74 print("画面遷移待機中") 75 waitResult, msg = waitOpenWindow(driver, winNum) 76 if waitResult == False: 77 return False, "ウインドウ表示に失敗しました" 78 print(msg) 79 80 #新規ウインドウに遷移する ★1 81 win = driver.window_handles[-1] #リストの最後=最後に開いたウインドウ 82 driver.switch_to.window(win) 83 print("画面名", driver.title) 84 winNum = len(driver.window_handles) 85 86 #アラート待機 ★2 87 print("アラート表示待機中") 88 resultCode, msg = waitAlert(driver) 89 if resultCode == 1: 90 Alert(driver).accept() 91 print(msg) 92 93 print("end process") 94 95 except: 96 print("予期しないエラーが発生しました") 97 print(traceback.format_exc()) 98 #ログ出力 99 driver.quit() 100 101 return True, "アクセス成功" 102 103########################################################################### 104#実行 105 106result, msg = access() 107print(msg) 108

試したこと

  • 上記のコードを実行したが、driver.switch_to.window(win) で無限ループしている模様
  • アラートのチェック(★2)と、ウインドウの遷移(★1)の順番を入れかえた、が
wait = WebDriverWait(driver, maxWaitSec) wait.until(expected_conditions.alert_is_present())

の部分で無限ループしている模様です

補足情報(FW/ツールのバージョンなど)

  • AnacondaにてPython環境をインストール
  • Python 3.6.4 64bit
  • selenium 3.1.0
  • Win10 64bit

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

ボタンクリック後、「遷移前のウインドウ」にdriver.switch_to_window(win)で遷移すると、
その後のアラート処理、ウインドウ遷移が実行できるようです

win1 = driver.window_handles[-1] driver.find_element_by_link_text("javascriptによる小ウインドウ表示").click() #遷移前のウインドウに遷移する driver.switch_to_window(win1) #アラート処理 #ウインドウ遷移 win2 = driver.window_handles[-1] driver.switch_to_window(win2)

投稿2018/05/14 13:36

gologius

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問