最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python3+selenium4實(shí)現(xiàn)切換窗口與iframe的方法

 更新時(shí)間:2021年05月27日 08:44:06   作者:Tester_謎城  
在自動(dòng)化測(cè)試過程中,有時(shí)后會(huì)遇到元素定位方式?jīng)]有問題,但是依舊拋出無法找到元素的異常的問題,有可能是由于當(dāng)前焦點(diǎn)不在指定頁面或iframe導(dǎo)致的,本文就來說明 一下

在自動(dòng)化測(cè)試過程中,有時(shí)后會(huì)遇到元素定位方式?jīng)]有問題,但是依舊拋出無法找到元素的異常的問題,通常情況下,如果元素定位沒有問題,但還是無法找到元素,則可能是由于當(dāng)前焦點(diǎn)不在指定頁面或iframe導(dǎo)致的,以下將對(duì)兩種情況分別進(jìn)行說明

1、切換窗口

比如我們現(xiàn)在有這樣一個(gè)需求,進(jìn)入百度首頁后,點(diǎn)擊新聞,然后在新聞頁面的搜索框輸入selenium

在這里插入圖片描述

在這里插入圖片描述

而使用selenium要如何實(shí)現(xiàn)呢,在對(duì)selenium不是很熟悉的情況下,僅僅學(xué)習(xí)了之前的內(nèi)容,寫出的代碼就可能會(huì)拋出找不到貼吧搜索輸入框元素異常,示例代碼如下

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Edge()
driver.get("https://www.baidu.com/")
driver.find_element(By.LINK_TEXT, '新聞').click()   # 點(diǎn)擊新聞
driver.find_element(By.ID, 'ww').send_keys('selenium')  # 在新聞首頁搜索框輸入selenium
driver.quit()

代碼看起來沒什么問題,打開百度首頁,點(diǎn)擊貼吧,然后在貼吧登錄頁面點(diǎn)擊立即注冊(cè),元素定位也沒錯(cuò),但是執(zhí)行就會(huì)拋出異常,無法找到貼吧的輸入框元素

在這里插入圖片描述

造成此錯(cuò)誤的原因是因?yàn)辄c(diǎn)擊新聞之后,又打開了一個(gè)新的窗口,此時(shí)打開的窗口有百度首頁和新聞頁,而selenium不知道我們需不需要切換窗口,所以不會(huì)自動(dòng)給我們切換窗口,需要手動(dòng)進(jìn)行窗口的切換

而要實(shí)現(xiàn)窗口的切換,則需要用到獲取瀏覽器句柄以及窗口切換的方法

1.1、獲取句柄

句柄是當(dāng)前瀏覽器窗口或選項(xiàng)卡的一個(gè)類似id一樣的唯一標(biāo)識(shí),可以用來判斷當(dāng)前窗口或選項(xiàng)卡是否在指定的窗口,獲取句柄的方法如下:

獲取當(dāng)前頁面句柄
driver.current_window_handle

獲取當(dāng)前所有存在的窗口句柄,多個(gè)句柄以列表方式存儲(chǔ)
driver.window_handles

通常的,我們只需要使用當(dāng)前窗口句柄與所有窗口句柄列表進(jìn)行對(duì)比,然后使用窗口切換的方法,就可以完成窗口的切換

1.2、切換窗口

要完成窗口切換,需要使用方法switch_to.window(),完成新聞頁輸入selenium操作完整成功的示例代碼如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Edge()
driver.get("https://www.baidu.com/")
driver.find_element(By.LINK_TEXT, '新聞').click()   # 點(diǎn)擊新聞

handle = driver.current_window_handle  # 獲取當(dāng)前窗口句柄
handles = driver.window_handles   # 獲取所有窗口句柄
for window_handle in handles:   # 循環(huán)比較句柄
    if window_handle != handle:   # 如果窗口句柄與當(dāng)前窗口句柄不一致,則切換到該窗口
        driver.switch_to.window(window_handle)

driver.find_element(By.ID, 'ww').send_keys('selenium')  # 在新聞首頁搜索框輸入selenium
time.sleep(2)
driver.quit()

以上代碼只適用于兩個(gè)窗口的切換,如果同時(shí)打開更多窗口,使用上述代碼只能切換到列表最后一個(gè)非當(dāng)前窗口,那存在多個(gè)窗口時(shí)需要如何準(zhǔn)確的切換到指定的窗口呢,其實(shí)只需要追加一層判斷即可,示例如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Edge()
driver.get("https://www.baidu.com/")
driver.find_element(By.LINK_TEXT, '新聞').click()   # 點(diǎn)擊新聞

handle = driver.current_window_handle  # 獲取當(dāng)前窗口句柄
handles = driver.window_handles   # 獲取所有窗口句柄
for window_handle in handles:   # 循環(huán)比較句柄
    if window_handle != handle:   # 如果窗口句柄與當(dāng)前窗口句柄不一致,則切換到該窗口
        driver.switch_to.window(window_handle)
        if driver.title == '百度新聞——海量中文資訊平臺(tái)':     # 如果切換后的窗口的title與指定的一致,結(jié)束循環(huán)
            break

driver.find_element(By.ID, 'ww').send_keys('selenium')  # 在新聞首頁搜索框輸入selenium
time.sleep(2)
driver.quit()

上述代碼中添加了一層判斷切換后的窗口title是否與預(yù)期一致,如果一致則跳出循環(huán)以保證多窗口切換時(shí)能夠準(zhǔn)確的切換到預(yù)期的窗口就停止切換

1.3、關(guān)閉窗口并切換回原窗口

在切換到指定窗口完成測(cè)試后,如果我們需要關(guān)閉此窗口并切換到原來的窗口,示例代碼如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Edge()
driver.get("https://www.baidu.com/")
driver.find_element(By.LINK_TEXT, '新聞').click()   # 點(diǎn)擊新聞

handle = driver.current_window_handle  # 獲取當(dāng)前窗口句柄
handles = driver.window_handles   # 獲取所有窗口句柄
for window_handle in handles:   # 循環(huán)比較句柄
    if window_handle != handle:   # 如果窗口句柄與當(dāng)前窗口句柄不一致,則切換到該窗口
        driver.switch_to.window(window_handle)
        if driver.title == '百度新聞——海量中文資訊平臺(tái)':     # 如果切換后的窗口的title與指定的一致,結(jié)束循環(huán)
            break
driver.find_element(By.ID, 'ww').send_keys('selenium')  # 在新聞首頁搜索框輸入selenium

driver.close()  # 關(guān)閉當(dāng)前新聞窗口
driver.switch_to.window(handle)  # 切換回原窗口,即百度首頁
driver.find_element(By.ID, 'kw').send_keys('selenium')   # 百度首頁輸入框輸入selenium
time.sleep(2)
driver.quit()

需要注意的是,close()方法只是關(guān)閉當(dāng)前所在窗口,但驅(qū)動(dòng)的瀏覽器依舊處于等待執(zhí)行狀態(tài),而quit()則會(huì)退出當(dāng)前會(huì)話,無論打開了多少個(gè)窗口,均會(huì)被一次性關(guān)閉,且瀏覽器不再接受新的操作命令

2、切換iframe

除了打開多個(gè)窗口會(huì)導(dǎo)致無法找到元素之外,如果元素包含在iframe中,也會(huì)導(dǎo)致無法找到元素,比如現(xiàn)有如下元素:

<html>
    <iframe src="a.html" id="frame0" name="frame1">
        <input id="kw" / >
    </iframe>
</html>

此時(shí)id為kw的input標(biāo)簽元素處于iframe中,要定位此元素,若直接使用

driver.find_element(By.ID, 'kw')

也會(huì)拋出無法找到元素的異常,那么如何實(shí)現(xiàn)frame的切換,從而精準(zhǔn)定位到元素呢

2.1、切換到iframe中

selenium提供了switch_to.frame()方法用于實(shí)現(xiàn)frame的切換,此方法接收id、name、index以及selenium的WebElement對(duì)象用來實(shí)現(xiàn)切換,比如上述的代碼中,要切換到iframe中,則可以使用以下代碼實(shí)現(xiàn):

from selenium import webdriver

driver = webdriver.Edge()
driver.switch_to.frame('frame0')   # 通過id切換iframe
# driver.switch_to.frame('frame1')   # 通過name切換iframe
# driver.switch_to.frame(0)   # 通過index切換iframe,0代表第一個(gè)
# driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))  # 通過WebElement對(duì)象切換iframe

一般情況下,通過id或name即可解決大部分iframe切換的問題,如果沒有這兩個(gè)屬性,再考慮使用index以及WebElement對(duì)象來實(shí)現(xiàn)

2.2、從frame中切換到主界面

在測(cè)試過程中,我們不僅會(huì)從主界面切換到iframe中,當(dāng)操作完frame中的元素后,經(jīng)常需要重新切換到主界面進(jìn)行其他操作,切換回主頁面使用方法如下:

driver.switch_to.default_content()

2.3、嵌套多層iframe的切換

有時(shí)候我們會(huì)遇到嵌套多層frame的情況,如下所示

<html>
    <iframe src="a.html" id="frame1">
    	    <iframe src="b.html" id="frame2" >
    			<input id="kw" / >
			</iframe>
    </iframe>
</html>

多層嵌套的情況下,如果要從主界面切換到第二層iframe,則需要一層一層的切換進(jìn)去,即先切換到frame1,再切換到frame2,而不是直接切換進(jìn)入frame2

driver.switch_to.frame("frame1")
driver.switch_to.frame("frame2")

selenium還提供了一個(gè)切換到父frame的方法,比如我們切換到frame2之后,要想切換到frame1操作,則不需要先切回主界面再切換到frame,而是使用如下方法:

driver.switch_to.parent_frame()

需要注意的是,如果當(dāng)前已經(jīng)是主頁面,則使用此方法無效
靈活使用以上方法,則可輕松應(yīng)對(duì)iframe的切換與窗口切換的問題,從此告別定位不到元素的苦惱

到此這篇關(guān)于python3+selenium4實(shí)現(xiàn)切換窗口與iframe的方法的文章就介紹到這了,更多相關(guān)python3 selenium4切換窗口與iframe內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python中struct模塊之字節(jié)型數(shù)據(jù)的處理方法

    python中struct模塊之字節(jié)型數(shù)據(jù)的處理方法

    今天小編就為大家分享一篇python中struct模塊之字節(jié)型數(shù)據(jù)的處理方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • 將Emacs打造成強(qiáng)大的Python代碼編輯工具

    將Emacs打造成強(qiáng)大的Python代碼編輯工具

    這篇文章主要介紹了將Emacs打造成強(qiáng)大的Python代碼編輯工具的方法,人們常說Vim是編輯器之神而Emacs是神的編輯器:)需要的朋友可以參考下
    2015-11-11
  • 詳解Python中httptools模塊的使用

    詳解Python中httptools模塊的使用

    httptools?是一個(gè)?HTTP?解析器,它首先提供了一個(gè)?parse_url?函數(shù),用來解析?URL。這篇文章就來和大家聊聊它的用法吧,感興趣的可以了解一下
    2023-03-03
  • python strip() 函數(shù)和 split() 函數(shù)的詳解及實(shí)例

    python strip() 函數(shù)和 split() 函數(shù)的詳解及實(shí)例

    這篇文章主要介紹了 python strip() 函數(shù)和 split() 函數(shù)的詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Python中的裝飾器類詳解

    Python中的裝飾器類詳解

    Python?裝飾器在很多情況下是一個(gè)非常有用的工具,它們可以用于修改或增強(qiáng)函數(shù)或類的行為,本篇文章將深入探討如何在?Python?中使用類裝飾器
    2023-06-06
  • Python 實(shí)現(xiàn)加密過的PDF文件轉(zhuǎn)WORD格式

    Python 實(shí)現(xiàn)加密過的PDF文件轉(zhuǎn)WORD格式

    這篇文章主要介紹了Python 實(shí)現(xiàn)加密過的PDF文件轉(zhuǎn)WORD格式,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Python函數(shù)式編程指南(四):生成器詳解

    Python函數(shù)式編程指南(四):生成器詳解

    這篇文章主要介紹了Python函數(shù)式編程指南(四):生成器詳解,本文講解了生成器簡(jiǎn)介、生成器函數(shù)、生成器函數(shù)的FAQ等內(nèi)容,需要的朋友可以參考下
    2015-06-06
  • python日志通過不同的等級(jí)打印不同的顏色(示例代碼)

    python日志通過不同的等級(jí)打印不同的顏色(示例代碼)

    這篇文章主要介紹了python日志通過不同的等級(jí)打印不同的顏色,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • python?獲取list?長(zhǎng)度

    python?獲取list?長(zhǎng)度

    這篇文章主要介紹了python?獲取list?長(zhǎng)度?,下面文章我們將研究獲取長(zhǎng)度列表的不同方法,使用內(nèi)置的len()函數(shù),len是默認(rèn)情況下python提供的內(nèi)置函數(shù),下面進(jìn)入文章了解更多的詳細(xì)內(nèi)容吧
    2022-02-02
  • python?opencv實(shí)現(xiàn)灰度圖和彩色圖的互相轉(zhuǎn)換

    python?opencv實(shí)現(xiàn)灰度圖和彩色圖的互相轉(zhuǎn)換

    這篇文章主要給大家介紹了關(guān)于python?opencv實(shí)現(xiàn)灰度圖和彩色圖的互相轉(zhuǎn)換,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-01-01

最新評(píng)論

武清区| 黔江区| 平泉县| 阿合奇县| 永仁县| 蕉岭县| 旌德县| 大宁县| 建始县| 武定县| 全椒县| 锦屏县| 浦城县| 永宁县| 小金县| 惠州市| 泰安市| 奈曼旗| 阳高县| 文安县| 平南县| 文昌市| 丹江口市| 垣曲县| 林周县| 临湘市| 尤溪县| 五家渠市| 依兰县| 九江市| 千阳县| 天等县| 石渠县| 策勒县| 安徽省| 井陉县| 溧水县| 冕宁县| 江川县| 六盘水市| 中山市|