一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - python3+selenium4實現切換窗口與iframe的方法

python3+selenium4實現切換窗口與iframe的方法

2021-11-14 10:51Tester_謎城 Python

在自動化測試過程中,有時后會遇到元素定位方式沒有問題,但是依舊拋出無法找到元素的異常的問題,有可能是由于當前焦點不在指定頁面或iframe導致的,本文就來說明 一下

在自動化測試過程中,有時后會遇到元素定位方式沒有問題,但是依舊拋出無法找到元素的異常的問題,通常情況下,如果元素定位沒有問題,但還是無法找到元素,則可能是由于當前焦點不在指定頁面或iframe導致的,以下將對兩種情況分別進行說明

1、切換窗口

比如我們現在有這樣一個需求,進入百度首頁后,點擊新聞,然后在新聞頁面的搜索框輸入selenium

python3+selenium4實現切換窗口與iframe的方法

python3+selenium4實現切換窗口與iframe的方法

而使用selenium要如何實現呢,在對selenium不是很熟悉的情況下,僅僅學習了之前的內容,寫出的代碼就可能會拋出找不到貼吧搜索輸入框元素異常,示例代碼如下

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()   # 點擊新聞
driver.find_element(By.ID, "ww").send_keys("selenium")  # 在新聞首頁搜索框輸入selenium
driver.quit()

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

python3+selenium4實現切換窗口與iframe的方法

造成此錯誤的原因是因為點擊新聞之后,又打開了一個新的窗口,此時打開的窗口有百度首頁和新聞頁,而selenium不知道我們需不需要切換窗口,所以不會自動給我們切換窗口,需要手動進行窗口的切換

而要實現窗口的切換,則需要用到獲取瀏覽器句柄以及窗口切換的方法

1.1、獲取句柄

句柄是當前瀏覽器窗口或選項卡的一個類似id一樣的唯一標識,可以用來判斷當前窗口或選項卡是否在指定的窗口,獲取句柄的方法如下:

獲取當前頁面句柄
driver.current_window_handle

獲取當前所有存在的窗口句柄,多個句柄以列表方式存儲
driver.window_handles

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

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()   # 點擊新聞

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

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

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

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()   # 點擊新聞

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

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

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

1.3、關閉窗口并切換回原窗口

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

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()   # 點擊新聞

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

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

需要注意的是,close()方法只是關閉當前所在窗口,但驅動的瀏覽器依舊處于等待執行狀態,而quit()則會退出當前會話,無論打開了多少個窗口,均會被一次性關閉,且瀏覽器不再接受新的操作命令

2、切換iframe

除了打開多個窗口會導致無法找到元素之外,如果元素包含在iframe中,也會導致無法找到元素,比如現有如下元素:

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

此時id為kw的input標簽元素處于iframe中,要定位此元素,若直接使用

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

也會拋出無法找到元素的異常,那么如何實現frame的切換,從而精準定位到元素呢

2.1、切換到iframe中

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

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代表第一個
# driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))  # 通過WebElement對象切換iframe

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

2.2、從frame中切換到主界面

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

driver.switch_to.default_content()

2.3、嵌套多層iframe的切換

有時候我們會遇到嵌套多層frame的情況,如下所示

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

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

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

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

driver.switch_to.parent_frame()

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

到此這篇關于python3+selenium4實現切換窗口與iframe的方法的文章就介紹到這了,更多相關python3 selenium4切換窗口與iframe內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/qq_18298049/article/details/117303257

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲欧美日本在线观看 | 亚洲精品 欧美 | 亚洲国产精品第一区二区三区 | 3黑人巨大vs北岛玲 3d肉浦团在线观看 3d动漫免费 | 99久久精品国语对白 | 91精品国产一区 | 国产尤物视频 | ipx 在线播放| 国产午夜精品不卡视频 | 1024免费观看完整版在线播放 | 惩罚狠h调教灌满 | 国产欧美日韩成人 | 天天做天天爽天天谢 | 久久综合久综合久久鬼色 | 色多多在线视频 | 99在线精品日韩一区免费国产 | 色老妈| 欧美大美bbb和大白屁股 | bl双性受乖调教改造身体 | 性xxxx18学生第一次出血 | 国产精品www视频免费看 | 国内精品九一在线播放 | bl双性受乖调教改造身体 | a级精品九九九大片免费看 a级动漫 | 日韩亚洲欧美综合一区二区三区 | 美女翘臀内疯狂进出 | 天天欲色成人综合网站 | 亚洲国产一区二区三区青草影视 | 亚洲视频一区网站 | 成人国产在线视频 | 免费国产影视观看网站入口 | xxxx在线视频| 大乳孕妇一级毛片 | se01在线看片 | 国产成人精品一区二三区在线观看 | 亚洲精品乱码久久久久久蜜桃图片 | 国产精品思瑞在线观看 | 暗卫调教女主肉高h | 久久婷婷五月综合色丁香 | av在线亚洲男人的天堂 | 男人叼女人的痛爽视频免费 |