前言
1、在瀏覽網(wǎng)頁的時候,有時點擊一個鏈接或者按鈕,會彈出一個新的窗口。這類窗口也被稱之為句柄(一個瀏覽器窗口的唯一標識符,通過句柄實現(xiàn)不同瀏覽器窗口之間的切換),在我們手動控制瀏覽器的時候,產(chǎn)生新的句柄時瀏覽器會自動的幫我們跳轉到最新的句柄處(鼠標聚焦于最新打開的瀏覽器窗口)。
2、在UI自動化的過程中,代碼并不會默認自動的跳轉到最新的句柄處,需要代碼去切換句柄也就是切換瀏覽器窗口。
3、使用Selenium工具進行 Web UI自動化測試,如果彈出新窗口時,沒有對窗口進行切換,那么,WebDriver 對象 的焦點對應的,依然是舊窗口,后續(xù)的自動化操作,將繼續(xù)在舊窗口中進行。所以我們需要使用代碼來切換瀏覽器窗口。
方法
①獲取當前瀏覽器的所有窗口句柄
handles=driver.window_handles # 返回值是一個列表
解釋: WebDriver 對象 中有 window_handles 屬性 ,返回一個列表,里面記錄了當前瀏覽器所有的窗口句柄。【句柄:;瀏覽器對應窗口的 id】
②切換到最開始打開的窗口
driver.switch_to.window(handles[0])
解釋:如果UI自動化操作的瀏覽器打開了多個窗口,那么獲取到的列表的最后一個元素即為最新的瀏覽器窗口句柄。
③切換到最新打開的窗口
driver.switch_to.window(handles[-1])
④切換到倒數(shù)第二個打開的窗口
driver.switch_to.window(handles[-2])
⑤獲取 WebDriver 對象 當前聚焦的瀏覽器窗口句柄
driver.current_window_handle()
⑥驗證 WebDriver 對象 的焦點是否聚焦在最新打開的瀏覽器窗口
print(self.browser.current_url) # 打印所有的窗口 ['窗口ID1', '窗口ID2', '窗口ID3'] ==> 窗口句柄 windows = self.browser.window_handles driver.switch_to.window(drivers[-1]) # 切換到最后的窗口后,打印下url,核對下是不是最后的窗口 print(driver.current_url) current_window = self.browser.current_window_handle next_window_index = windows.index(current_window) + 1 self.browser.switch_to.window(windows[next_window_index])
⑦selenium工具瀏覽器窗口句柄切換API
實例
①示例1
1、手動操作瀏覽器打開打開趕集網(wǎng):http://bj.ganji.com/,點擊招聘求職按鈕會發(fā)現(xiàn)右邊多了一個窗口標簽。
2、當我們用代碼去執(zhí)行點擊的時候,發(fā)現(xiàn)界面上出現(xiàn)兩個窗口,如下圖這種情況就是瀏覽器的多窗口了。
【注意】:手動操作瀏覽器時呈現(xiàn)的效果是兩個標簽,而腳本執(zhí)行時卻出現(xiàn)了兩個頁面的原因:(默認腳本執(zhí)行是不加載任何配置的)【手工點擊是在瀏覽器中瀏覽器默認設置了新窗口打開方式為標簽,而瀏覽器中的默認打開新窗口的方式為出現(xiàn)一個新頁面】
3、獲取當前瀏覽器的窗口句柄
①元素有屬性,瀏覽器的窗口其實也有屬性的,只是你看不到,瀏覽器窗口的屬性用句柄(handle)來識別。
②人為操作的話,可以通過眼睛看,識別不同的窗口點擊切換。但是腳本沒長眼睛,它不知道你要操作哪個窗口,這時候只能句柄來判斷了。
③獲取當前頁面的句柄方法: driver.current_window_handle
4、獲取所有的瀏覽器句柄
①定位趕集網(wǎng)招聘求職按鈕,并點擊
②點擊后,獲取當前所以的句柄: driver.window_handles
5、切換句柄
方法一:
1.循環(huán)判斷是否與首頁句柄相等。
2.如果不等,說明是新頁面的句柄。
3.獲取的新頁面句柄后,可以切換到新打開的頁面上。
4.打印新頁面的title或者url,看瀏覽器窗口是否切換成功。
方法二:
直接在獲取到的瀏覽器句柄列表中取最后一個元素,然后代碼中切換到這個句柄id。
6、關閉新窗口,切回主頁
1.打開新頁面后,其實只想驗證新頁面跳轉對不對,這里可以做個簡單的驗證,獲取當前頁面的title驗證
2.驗證完后切關閉新窗口
3.切回句柄到首頁
4.打印當前頁面的句柄,看是否切換到首頁了
②示例2
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains class Truelogin(unittest.TestCase): self.option = webdriver.ChromeOptions() self.option.add_experimental_option("excludeSwitches", ['enable-automation', 'load-extension']) self.prefs["credentials_enable_service"] = False self.prefs["profile.password_manager_enabled"] = False self.option.add_experimental_option("prefs", self.prefs) self.driver = webdriver.Chrome(options=self.option) self.driver.maximize_window() def testcloudAIlogin(self): self.driver.switch_to.frame(0) self.driver.find_element_by_xpath("http://input[@id='username']").send_keys("用戶名") self.driver.find_element_by_xpath("http://input[@id='password']").send_keys("密碼*") self.driver.find_element_by_xpath("http://div[@class='button']/a[@id='loginbtn']").click() self.window1 = self.driver.current_window_handle self.driver.find_element_by_css_selector("input#search-keyword").send_keys("名稱") ActionChains(self.driver).move_to_element(self.driver.find_element_by_xpath("http://a/span[text()='名稱']")).perform() self.driver.find_element_by_xpath("http://a/span[text()='名稱']").click() self.all_handles = self.driver.window_handles for self.handle in self.all_handles: if self.handle != self.window1: self.driver._switch_to.window(self.handle) self.assertEqual("用戶名",self.driver.find_element_by_xpath("http://div[text()='用戶名']").text) if __name__ == '__main__':
附加知識
在web頁面上經(jīng)常有點擊一個頁面后,另外打開一個新窗口,是因為html中 a標簽 的 target屬性 是 _bank 。
在HTML中a標簽target屬性目標的四個參數(shù)的用法:
1、target="_self"表示:將鏈接的畫面內(nèi)容,顯示在目前的視窗中。(內(nèi)定值) 。 即:同窗口打開。 2、target="_parent"表示:將鏈接的畫面內(nèi)容,當成文件的上一個畫面。即:當前窗口打開。 3、target="_top"表示:將框架中鏈接的畫面內(nèi)容,顯示在沒有框架的視窗中(即除去了框架)。即:頂端打開窗口。 4、target="_blank"表示:將鏈接的畫面內(nèi)容,在新的瀏覽視窗中打開。即:打開新窗口。 注意:當網(wǎng)頁沒有框架時,target="_self"和target="_parent"以及target="_top"三種方式的顯示方式幾乎相同。
|