簡體   English   中英

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

[英]How to switch window handles using Selenium and Python

如果您單擊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窗口,而無法識別彈出窗口。 如何獲取彈出窗口的網址?

要獲取當前網址,可以使用:

windows = driver.current_url
print(windows)

正如Simon在討論中明確提到的那樣:

雖然用於存儲句柄列表的數據類型可以通過插入來排序,但是WebDriver實現在窗口句柄上迭代以插入它們的順序並不需要穩定。 順序是任意的。

因此,您必須:

  • 誘導WebDriverWait等待number_of_windows_to_be(2)
  • 由於窗口的順序是隨機的,因此您可以在執行交互之前獲取窗口句柄的集合,並將其與執行操作后的窗口句柄進行比較。
  • 您可以使用以下解決方案:

     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) 

參考資料:您可以在以下位置找到一些相關的討論:

我通常使用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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM