selenium標簽頁創建、切換與關閉


  # 先進行一些必要操作
  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版本中的創建新頁面后自動進行切換是沒有的,需要注意。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM