我正在执行浏览器自动化,并且在某个时候被阻止:稍后,我要求浏览器单击一个按钮,该按钮又打开一个新窗口。但是有时Internet太慢,因此加载新窗口需要时间。我想知道如何让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])
我不时收到此错误:
newNewWindow = newWindow [1] IndexError:列表索引超出范围
newNewWindow = newWindow [1]
IndexError:列表索引超出范围
这让我认为简单的“ time.sleep(5)”无法完成工作。
所以,我的问题是,如何与该新窗口完全加载后再进行交互?
谢谢
您可以尝试使用以下代码等待直到出现新窗口:
WebDriverWait(driver, 20).until(EC.number_of_windows_to_be(2))
您的代码应如下所示
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)
考虑到@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)