1. 程式人生 > >selenium+python自動化測試(五)--多視窗切換

selenium+python自動化測試(五)--多視窗切換

在很多頁面上都有可點選的連結,點選這些連結會開啟一個新的視窗,這時如果要在新開啟的視窗中操作頁面,就需要先切換到新視窗中,如果不進行切換操作,還是操作的上一個頁面視窗

瀏覽器視窗的切換通過控制代碼(handle)來操作,每個視窗都有一個控制代碼,代表當前視窗,需要操作哪個頁面的視窗,切換到視窗對應的控制代碼。通過driver.switch_to.window(handle)來切換控制代碼

在新的視窗中開啟頁面

開啟百度首頁,點選右上角的新聞連結,預設會在當前視窗中開啟。現在通過修改點選元素的屬性,讓新開啟的頁面顯示在一個新的視窗中。

找到新聞元素的定義

<a class="mnav"
href="http://news.baidu.com" name="tj_trnews">
新聞</a>

修改上面的程式碼,為news元素增加一個屬性:target=”_blank”,增加這個屬性後,再次點選連結,就會開啟一個新的視窗來開啟頁面。通過執行js語句為元素增加屬性

# -*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.Chrome()
driver.get
("http://www.baidu.com") time.sleep(3) #通過執行js語句為元素新增target="_blank"屬性 js = 'document.getElementsByName("tj_trnews")[0].target="_blank"' driver.execute_script(js) news = driver.find_element_by_name('tj_trnews') news.click()

webdriver執行js語句的內容在後面的部落格中會有講解,這裡先使用一下,這樣設定後,再次開啟新聞頁面時就會在新的視窗中開啟。在上面的程式碼中再加入兩句

# -*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(3)
print(driver.current_window_handle)  #列印當前頁面的控制代碼
print(driver.title)  #列印頁面標題

#通過執行js語句為元素新增target="_blank"屬性
js = 'document.getElementsByName("tj_trnews")[0].target="_blank"'
driver.execute_script(js)

news = driver.find_element_by_name('tj_trnews')
news.click()
time.sleep(3)

handles = driver.window_handles  #獲取所有開啟視窗的控制代碼
print(handles)

程式輸出:

這裡寫圖片描述

第一次列印的結果是首頁的控制代碼,第二次結果是獲取到的當前所有開啟的視窗控制代碼。一共打開了兩個視窗,一個是主頁,另一個是點選新聞開啟的頁面,所以第二次獲取到的是一個list,包含兩個視窗的控制代碼。

獲取到視窗的控制代碼後,就可以通過切換控制代碼來操作頁面,開啟新聞頁面後,當前的控制代碼還是主頁的控制代碼,如果要操作第二個頁面,需要將控制代碼切換到第二個視窗

driver.switch_to.window(handles[1])
print(driver.current_window_handle)
print(driver.title)

輸出結果:

這裡寫圖片描述

可以看到,切換後再次列印的控制代碼是list的第二個元素,也就是將控制代碼切換到了第二個開啟的新視窗中,這樣就可以操作第二個頁面中的元素了。在切換控制代碼後列印了一下頁面標題,根據標題得知控制代碼已經切換到新聞頁面視窗了

在操作完新聞頁面後,使用close()關閉當前頁面,close和quit的區別在selenium+python自動化測試(二)–使用webdriver操作瀏覽器中已經說明過,關閉當前頁面後會回到首頁,需要將控制代碼再切換回主頁

driver.switch_to.window(handles[0])
print(driver.title)

輸出結果:

這裡寫圖片描述

控制代碼又切換為了首頁的控制代碼,現在又可以操作主頁的元素了

全部程式碼:

# -*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(3)
print(driver.current_window_handle)  #列印當前視窗的控制代碼
print(driver.title)  #列印當前頁面標題

#通過執行js語句為元素新增target="_blank"屬性
js = 'document.getElementsByName("tj_trnews")[0].target="_blank"'
driver.execute_script(js)

news = driver.find_element_by_name('tj_trnews')
news.click()
time.sleep(3)

handles = driver.window_handles  #獲取當前開啟的所有視窗的控制代碼
print(handles)

driver.switch_to.window(handles[1])  #切換到第二個視窗的控制代碼
print(driver.current_window_handle)
print(driver.title)

driver.switch_to.window(handles[0])  #切換回主頁控制代碼
print(driver.title)