Python 3.5 - Selenium - 如何处理新窗口并等待它完全加载?

Mic*_*ael 3 python browser selenium webdriver selenium-webdriver

我正在执行浏览器自动化,但在某个时刻被阻止:有一刻,我要求浏览器单击一个按钮,然后打开一个新窗口。但有时互联网太慢,所以这个新窗口需要时间来加载。我想知道如何让 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])
Run Code Online (Sandbox Code Playgroud)

我不时收到此错误:

newNewWindow = newWindow[1]

IndexError:列表索引超出范围

这让我觉得一个简单的 'time.sleep(5)' 不起作用。

所以,我的问题是,如何才能等到这个新窗口完全加载后再与之交互?

谢谢

And*_*son 6

您可以尝试使用以下代码等待新窗口出现:

WebDriverWait(driver, 20).until(EC.number_of_windows_to_be(2))
Run Code Online (Sandbox Code Playgroud)

你的代码应该看起来像

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)
Run Code Online (Sandbox Code Playgroud)

考虑到@JimEvans 评论,请尝试以下操作:

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)
Run Code Online (Sandbox Code Playgroud)

  • 我将在这里指出,这段代码有一个常见的谬误,即假设 `window_handles` 返回的窗口句柄列表是有序的。它不是。换句话说,如果有两个窗口句柄,`window_handles[0]` 可能不是第一个打开的,而 `window_handles[1]` 可能不是最后一个打开的。 (2认同)