如何使用Selenium和Python切换窗口句柄

时间:2019-08-20 06:00:33

标签: python selenium selenium-webdriver webdriverwait window-handles

如果您在Windows程序而非Web浏览器中单击链接,则会出现一个弹出窗口。我想获取此弹出窗口的网址。弹出窗口仅在IE中打开。

driver = webdriver.Ie('C://Users/aaa/IEDriverServer.exe')
driver.implicitly_wait(3)
pyautogui.moveTo(1576, 660)
pyautogui.click()
time.sleep(3)
driver.switch_to_window(driver.window_handles[1])
   # error =>driver.switch_to_window(driver.window_handles[1])
   #         IndexError: list index out of range
driver.get_window_position(driver.window_handles[1])

windows = driver.window_handles
   # Commenting out the above two lines will result in only one active web 
   # browser in windows.
print(windows)

driver = webdriver.Ie('C://Users/seula/IEDriverServer.exe')
driver.implicitly_wait(3)
pyautogui.moveTo(1576, 660)
pyautogui.click()
time.sleep(3)
driver.switch_to_window(driver.window_handles[1])
   # error =>driver.switch_to_window(driver.window_handles[1])
   #         IndexError: list index out of range
driver.get_window_position(driver.window_handles[1])

windows = driver.window_handles
   # Commenting out the above two lines will result in only one active web 
   # browser in windows.
print(windows)

在此源代码中,运行IEDriver.exe将打开一个localhost窗口,并在您单击pyautogui指向Windows程序的链接时弹出。 但是,如果我使用driver.window_handles进行检查,则仅显示localhost窗口,而无法识别弹出窗口。如何获取弹出窗口的网址?

3 个答案:

答案 0 :(得分:0)

要获取当前网址,可以使用:

windows = driver.current_url
print(windows)

答案 1 :(得分:0)

正如西蒙在讨论中明确提到的那样:

  

虽然用于存储句柄列表的数据类型可以通过插入来排序,但是WebDriver实现在窗口句柄上迭代以插入它们的顺序并不要求稳定。顺序是任意的。

所以您必须:

  • number_of_windows_to_be(2)诱导 WebDriverWait
  • 由于窗口的顺序是随机的,因此您可以在执行交互之前获取窗口句柄的集合,并将其与执行操作后的窗口句柄进行比较。
  • 您可以使用以下解决方案:

    driver = webdriver.Ie('C://Users/aaa/IEDriverServer.exe')
    driver.implicitly_wait(3)
    windows_before  = browser.current_window_handle
    pyautogui.moveTo(1576, 660)
    pyautogui.click()
    WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))
    windows_after = driver.window_handles
    new_window = [x for x in windows_after if x != windows_before][0]
    driver.switch_to.window(new_window)
    

参考:您可以在以下几个相关的讨论中找到

答案 2 :(得分:0)

我通常使用send_keys()而不是click()来处理弹出窗口。

尝试使用以下代码:

pyautogui.send_keys(Keys.CONTROL + Keys.ENTER)
driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + "2")
# window_handles[-1] refer to last window created.
driver.switch_to.window(self.driver.window_handles[-1])
url = driver.current_url
print(url)