How to switch window handles using Selenium and Python

醉酒当歌 提交于 2021-02-05 08:56:33

问题


If you click a link in a Windows program other than a web browser, a pop-up window appears. I want to get the url of this popup window. Pop-up windows will only open in 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)

In this source, running IEDriver.exe opens a localhost window and pops up when you click on a link to a Windows program with pyautogui. However, if I check with driver.window_handles, only the localhost window is shown and the popup window is not recognized. How can I get the popup window url?


回答1:


As Simon clearly mentioned in a discussion:

While the datatype used for storing the list of handles may be ordered by insertion, the order in which the WebDriver implementation iterates over the window handles to insert them has no requirement to be stable. The ordering is arbitrary.

So you have to:

  • Induce WebDriverWait for number_of_windows_to_be(2)
  • As the order of the windows are random, you can obtain the set of window handles before the interaction is performed and compare it with the set after the action is performed.
  • You can use the following solution:

    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)
    

References: You can find a couple of relevant discussions in:

  • How to open multiple hrefs within a webtable to scrape through selenium
  • “NoSuchWindowException: no such window: window was already closed” while switching tabs using Selenium and WebDriver through Python3



回答2:


For get current url, you can use :

windows = driver.current_url
print(windows)



回答3:


I usually use send_keys() instead of click() to handle pop-up window.

Try to use following code:

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)


来源:https://stackoverflow.com/questions/57567464/how-to-switch-window-handles-using-selenium-and-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!