selenium+python自動(dòng)化測(cè)試之多窗口切換
在很多頁(yè)面上都有可點(diǎn)擊的鏈接,點(diǎn)擊這些鏈接會(huì)打開(kāi)一個(gè)新的窗口,這時(shí)如果要在新打開(kāi)的窗口中操作頁(yè)面,就需要先切換到新窗口中,如果不進(jìn)行切換操作,還是操作的上一個(gè)頁(yè)面窗口
瀏覽器窗口的切換通過(guò)句柄(handle)來(lái)操作,每個(gè)窗口都有一個(gè)句柄,代表當(dāng)前窗口,需要操作哪個(gè)頁(yè)面的窗口,切換到窗口對(duì)應(yīng)的句柄。通過(guò)driver.switch_to.window(handle)來(lái)切換句柄
在新的窗口中打開(kāi)頁(yè)面
打開(kāi)百度首頁(yè),點(diǎn)擊右上角的新聞鏈接,默認(rèn)會(huì)在當(dāng)前窗口中打開(kāi)?,F(xiàn)在通過(guò)修改點(diǎn)擊元素的屬性,讓新打開(kāi)的頁(yè)面顯示在一個(gè)新的窗口中。
找到新聞元素的定義
<a class="mnav" rel="external nofollow" name="tj_trnews">新聞</a>
修改上面的代碼,為news元素增加一個(gè)屬性:target=”_blank”,增加這個(gè)屬性后,再次點(diǎn)擊鏈接,就會(huì)開(kāi)啟一個(gè)新的窗口來(lái)打開(kāi)頁(yè)面。通過(guò)執(zhí)行js語(yǔ)句為元素增加屬性
# -*- 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) #通過(guò)執(zhí)行js語(yǔ)句為元素添加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執(zhí)行js語(yǔ)句的內(nèi)容在后面的博客中會(huì)有講解,這里先使用一下,這樣設(shè)置后,再次打開(kāi)新聞頁(yè)面時(shí)就會(huì)在新的窗口中打開(kāi)。在上面的代碼中再加入兩句
# -*- 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) #打印當(dāng)前頁(yè)面的句柄 print(driver.title) #打印頁(yè)面標(biāo)題 #通過(guò)執(zhí)行js語(yǔ)句為元素添加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 #獲取所有打開(kāi)窗口的句柄 print(handles)
程序輸出:
第一次打印的結(jié)果是首頁(yè)的句柄,第二次結(jié)果是獲取到的當(dāng)前所有打開(kāi)的窗口句柄。一共打開(kāi)了兩個(gè)窗口,一個(gè)是主頁(yè),另一個(gè)是點(diǎn)擊新聞打開(kāi)的頁(yè)面,所以第二次獲取到的是一個(gè)list,包含兩個(gè)窗口的句柄。
獲取到窗口的句柄后,就可以通過(guò)切換句柄來(lái)操作頁(yè)面,打開(kāi)新聞頁(yè)面后,當(dāng)前的句柄還是主頁(yè)的句柄,如果要操作第二個(gè)頁(yè)面,需要將句柄切換到第二個(gè)窗口
driver.switch_to.window(handles[1]) print(driver.current_window_handle) print(driver.title)
輸出結(jié)果:
可以看到,切換后再次打印的句柄是list的第二個(gè)元素,也就是將句柄切換到了第二個(gè)打開(kāi)的新窗口中,這樣就可以操作第二個(gè)頁(yè)面中的元素了。在切換句柄后打印了一下頁(yè)面標(biāo)題,根據(jù)標(biāo)題得知句柄已經(jīng)切換到新聞頁(yè)面窗口了
在操作完新聞頁(yè)面后,使用close()關(guān)閉當(dāng)前頁(yè)面,close和quit的區(qū)別在selenium+python自動(dòng)化測(cè)試(二)–使用webdriver操作瀏覽器中已經(jīng)說(shuō)明過(guò),關(guān)閉當(dāng)前頁(yè)面后會(huì)回到首頁(yè),需要將句柄再切換回主頁(yè)
driver.switch_to.window(handles[0]) print(driver.title)
輸出結(jié)果:
句柄又切換為了首頁(yè)的句柄,現(xiàn)在又可以操作主頁(yè)的元素了
全部代碼:
# -*- 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) #打印當(dāng)前窗口的句柄 print(driver.title) #打印當(dāng)前頁(yè)面標(biāo)題 #通過(guò)執(zhí)行js語(yǔ)句為元素添加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 #獲取當(dāng)前打開(kāi)的所有窗口的句柄 print(handles) driver.switch_to.window(handles[1]) #切換到第二個(gè)窗口的句柄 print(driver.current_window_handle) print(driver.title) driver.switch_to.window(handles[0]) #切換回主頁(yè)句柄 print(driver.title)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用Python向C語(yǔ)言的鏈接庫(kù)傳遞數(shù)組、結(jié)構(gòu)體、指針類(lèi)型的數(shù)據(jù)
今天小編就為大家分享一篇關(guān)于使用Python向C語(yǔ)言的鏈接庫(kù)傳遞數(shù)組、結(jié)構(gòu)體、指針類(lèi)型的數(shù)據(jù),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01python3利用tcp實(shí)現(xiàn)文件夾遠(yuǎn)程傳輸
這篇文章主要為大家詳細(xì)介紹了python3利用tcp實(shí)現(xiàn)文件夾遠(yuǎn)程傳輸,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07python中將數(shù)據(jù)生成為Excel文件的5種方法舉例
工作中需要把數(shù)據(jù)導(dǎo)入到excel中,記錄一下操作方式,這篇文章主要給大家介紹了關(guān)于python中將數(shù)據(jù)生成為Excel文件的5種方法,文中通過(guò)圖文以及代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10Python中requirements.txt簡(jiǎn)介(推薦)
Python項(xiàng)目中必須包含一個(gè)?requirements.txt?文件,用于記錄所有依賴(lài)包及其精確的版本號(hào),以便新環(huán)境部署,這篇文章主要介紹了Python中requirements.txt簡(jiǎn)介,需要的朋友可以參考下2022-11-11Python實(shí)現(xiàn)word2Vec model過(guò)程解析
這篇文章主要介紹了Python實(shí)現(xiàn)word2Vec model過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12Python全棧之列表數(shù)據(jù)類(lèi)型詳解
這篇文章主要給大家介紹了關(guān)于Python全棧之列表數(shù)據(jù)類(lèi)型的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10