2017-01-10 64 views
2

私はブラウザの自動化を行っていて、特定の時点でブロックされています。瞬時に、ブラウザにボタンをクリックして新しいウィンドウを開きます。しかし、時にはインターネットが遅すぎることもあり、この新しいウィンドウには時間がかかります。この新しい新しいウィンドウが完全にロードされるまで、セレンにどのように待つように頼むことができますか?ここでPython 3.5 - Selenium - 新しいウィンドウを処理し、完全にロードされるまで待つ方法は?

は私のコードです:

driver.switch_to.default_content() 
Button = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, 'addPicturesBtn'))) 
Button.click() 
newWindow = driver.window_handles 
time.sleep(5) 
newNewWindow = newWindow[1] 
driver.switch_to.window(newNewWindow) 
newButtonToLoad = driver.find_element_by_id('d') 
newButtonToLoad.send_keys('pic.jpg') 
uploadButton = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, 'uploadPics'))) 
uploadButton.click() 
driver.switch_to.window(newWindow[0]) 

私は時々、このエラーを取得:

私は、単純な 'time.sleepは(5)' を実行しないことを考えさせる

newNewWindow = newWindow[1]

IndexError: list index out of range

作品。

私の質問は、この新しいウィンドウが完全に読み込まれるまで待ってからやりとりすることです。あなたは新しいウィンドウまで待機する以下のコードを使用しようとすることができ

おかげ

答えて

3

表示されます:あなたのコードは@JimEvansコメントを考慮し

Button.click() 

WebDriverWait(driver, 20).until(EC.number_of_windows_to_be(2)) 

newWindow = driver.window_handles 
newNewWindow = newWindow[1] 
driver.switch_to.window(newNewWindow) 

のように見えるはずです

WebDriverWait(driver, 20).until(EC.number_of_windows_to_be(2)) 

、以下試してください:

current = driver.window_handles[0] 
Button.click() 

WebDriverWait(driver, 20).until(EC.number_of_windows_to_be(2)) 

newWindow = [window for window in driver.window_handles if window != current][0] 
driver.switch_to.window(newWindow) 
+1

このコードでは、 'window_handles'によって返されたウィンドウハンドルリストが順序付けられていると仮定するのが一般的です。そうではない。言い換えれば、2つのウィンドウハンドルでは、 'window_handles [0]'は最初に開かれたものではなく、 'window_handles [1]'が最後に開かれたものではないかもしれません。 – JimEvans

+0

@JimEvansあなたはもう少し詳しく説明できますか?それは将来の問題を引き起こす可能性があるので、あなたが指摘している問題をどのように解決するのでしょうか? – Michael

+0

@JimEvans、OPに「this code」に関するコメントを混同しないようにしてください:)質問で提供された初期コードに記載されている脆弱性を言い、私の解決策を挿入することを指摘するために再利用します。 'window_handles'のリスト順序問題を解決する – Andersson

関連する問題