# 先進行一些必要操作
from selenium import webdriver
driver_path = r"D:\chromedriver\chromedriver.exe"
# 我使用的是Chrome瀏覽器
driver = webdriver.Chrome(executable_path=driver_path)
官方文檔
If your site opens a new tab or window, Selenium will let you work with it using a window handle. Each window has a unique identifier which remains persistent in a single session.
也就是說handle
就像id
一樣用來區分各頁面或窗口,因此可以對比彼此頁面的句柄(handle)來確定目前WebDriver的focus
在何處。(句柄的順序和標簽頁順序一致)
頁面創建
-
點擊頁面內的鏈接
# 打開百度 driver.get("https://www.baidu.com") # 打印出handle print(driver.current_window_handle) # ['CDwindow-054B40A910BFCD2D1E20DABB1272A62B'] # 點擊頁面里面的新聞鏈接 driver.find_element_by_name("tj_trnews").click() # 打印handle print(driver.current_window_handle) # ['CDwindow-054B40A910BFCD2D1E20DABB1272A62B']
沒有新建窗口,只是在原始頁面打開,所以只有一個句柄並且相同,當然,點擊
target="_blank"
的鏈接,是會在新的標簽頁打開頁面的,並且將會有兩個句柄,但是當前所在窗口句柄仍然相同 -
使用JS
# 打開百度 driver.get("https://www.baidu.com") # 打印出handle print(driver.window_handles) # ['CDwindow-560A9B54BF935A8249566C795D6D857D'] print(driver.current_window_handle) # CDwindow-560A9B54BF935A8249566C795D6D857D # 打開新頁面 driver.execute_script('window.open("http://news.baidu.com/")') # 直接在新的標簽頁打開了此頁面 # 打印出handle print(driver.window_handles) # ['CDwindow-560A9B54BF935A8249566C795D6D857D', 'CDwindow-108E4B9171C6D7FA4CCAAAF4FEACCAFE'] print(driver.current_window_handle) # CDwindow-560A9B54BF935A8249566C795D6D857D
打開了新的標簽頁,所以之后有兩個句柄,但是可以看到,兩次輸出當前句柄都是同一個,所以
focus
並沒有變化,依然是原始的標簽頁
官方文檔
Clicking a link which opens in a new window will focus the new window or tab on screen, but WebDriver will not know which window the Operating System considers active.
WebDriver 並不知道目前哪個窗口目前是處於活動狀態。
首先可以確認一點,句柄不變,那么對driver進行操作只會影響到原始頁面,因此當需要對新的頁面的(非原始[not the original])進行操作時,是需要進行切換的。
頁面切換
為了可以操作新頁面對象,頁面之間的切換是必不可少的
- 方法一
window_handle
會返回一個列表,包含了當window對象
所有的標簽頁,並且順序與此列表一致。因此可以直接使用列表索引進行切換。
可以看出driver.get("https://www.baidu.com") print(driver.current_window_handles) # CDwindow-BF39F0A6A262522BA4A72EA1B9244D65 driver.execute_script('window.open("http://news.baidu.com/")') print(driver.current_window_handles) # CDwindow-BF39F0A6A262522BA4A72EA1B9244D65 print("*" * 30) # *號隔開加以區分 driver.switch_to.window(driver.window_handles[1]) print(driver.current_window_handle) # CDwindow-34D81646E7A6EED9E8528EAEE5E8D117
switch_to.window()
后句柄就不一致了,說明focus
已經切換到新打開的窗口了,此后就可以對新頁面進行操作了。需要切換到原始頁面,再一次執行switch_to.window()
就行,注意句柄應該是0
索引
- 方法二(官方)
# Loop through until we find a new window handle for window_handle in driver.window_handles: if window_handle != original_window: driver.switch_to.window(window_handle) break
關閉close
當不再需要新的頁面后我們就將其關閉,driver.close()
即可,關閉后,window_handle
也就少了一個句柄。
需要注意的是,關閉一個頁面后,一定要記得切換到其他有效窗口句柄,怎樣切換就不說了。另外,頁面(句柄)關閉后,在進行切換之前,是不能再對已關閉的頁面進行任何操作的,即使是print(current_window_handle)
這樣的操作也不可以。
目前python最新版本是selenium 3.141.0
,也就是說selenium 4
版本中的創建新頁面后自動進行切換是沒有的,需要注意。