前提・実現したいこと
リンクをクリックする→新規ウインドウが開く(※ただしウインドウが開くと即アラートが出る)
という動きを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
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。