Selenium 系列篇(三):窗口篇

image

系列導(dǎo)讀

01. Selenium 系列篇(一):準(zhǔn)備篇

02. Selenium 系列篇(二):元素定位

1. 窗口操作

Selenium 自動(dòng)化過程中蜡秽,對窗口本身的操作包含:打開一個(gè)窗口颗味、關(guān)閉一個(gè)窗口、刷新一個(gè)窗口、窗口的回退和前進(jìn)。

其中,打開一個(gè)窗口只需要使用 driver.get( url) 方法舀寓,傳入一個(gè)網(wǎng)頁地址,即可以驅(qū)動(dòng)瀏覽器打開目標(biāo)網(wǎng)址肌蜻。

# 打開一個(gè)窗口網(wǎng)站
driver.get("http://www.baidu.com")

在多窗口頁面切換時(shí)互墓,WebDriver 提供了 API ,包含:back()蒋搜、forward()篡撵、refresh() 方便我們對瀏覽器執(zhí)行 回退、前進(jìn)豆挽、刷新頁面 的操作育谬。

# 打開一個(gè)窗口網(wǎng)站
driver.get("http://www.baidu.com")

# 打開第二個(gè)網(wǎng)站
driver.get("http://www.google.com")

# 回退到第一個(gè)窗口網(wǎng)站
driver.back()

# 前進(jìn)到第二個(gè)窗口網(wǎng)站
driver.forward()

# 刷新當(dāng)前頁面
driver.refresh()

默認(rèn)窗體是全屏顯示,也可以 顯式指定窗口展示的寬和高帮哈。

# 設(shè)定窗口的寬為1000膛檀,高為800
driver.set_window_size(1000, 800)

為了測試報(bào)告更直觀,往往需要截圖附件娘侍,Selenium 可以隨時(shí)對某一個(gè)窗口頁面進(jìn)行 截圖咖刃。

# 保存當(dāng)前頁面為圖片
driver.save_screenshot('./temp.png')

自動(dòng)化完成之后,我們一般需要 關(guān)閉窗口憾筏,使用 close() 可以關(guān)閉當(dāng)前窗口嚎杨,quit() 退出驅(qū)動(dòng)程序,關(guān)閉所有頁面氧腰。

# 關(guān)閉當(dāng)前窗口頁面
driver.close()

# 關(guān)閉所有窗口頁面
driver.quit() 

2. 內(nèi)部元素操作

窗口內(nèi)部元素使用最多的操作包含:點(diǎn)擊按鈕枫浙、輸入框的清空和設(shè)置內(nèi)容翠胰。

# 點(diǎn)擊某個(gè)按鈕
driver.find_element_by_id("element_btn").click()

# 清空輸入框
driver.find_element_by_id("element_edit").clear()

# 輸入框內(nèi)設(shè)置內(nèi)容
driver.find_element_by_id("element_edit").send_keys("Python自動(dòng)化測試社區(qū)")

獲取到一個(gè)元素之后,就能拿到 元素的內(nèi)容 和 全部屬性自脯。

?# 首先查找到網(wǎng)頁元素
norm_element = driver.find_element_by_id("element_norm")

# 獲取元素的尺寸大小
print(norm_element.size)

# 獲取元素的所有屬性,比如:type屬性
print(norm_element.get_attribute("type"))

3. 等待操作

自動(dòng)化打開一個(gè)網(wǎng)頁的時(shí)候斤富,內(nèi)部網(wǎng)頁元素加載完全有一點(diǎn)的延遲性膏潮,因此在做 Web 端的自動(dòng)化測試的時(shí)候,一般都需要在測試 case 時(shí)加入一些等待操作满力。

常用等待操作有 3 種焕参,分別是:sleep、隱式等待油额、顯示等待

其中叠纷,sleep(timeout) 是設(shè)定一個(gè)固定的等待時(shí)長,強(qiáng)行進(jìn)行等待潦嘶,使用方便的同時(shí)涩嚣,效率最低,不建議使用掂僵。

# 強(qiáng)行等待 10s
sleep(10)

隱式等待 也是設(shè)定一個(gè)固定的等待時(shí)間航厚,對整個(gè)生命周期的元素都起作用,每一個(gè)元素都會(huì)等待加載完全锰蓬,直到超過設(shè)定的等待時(shí)間幔睬。

# 隱式等待設(shè)定時(shí)長為5s
driver.implicitly_wait(5)

driver.get('http://www.google.com')

# 隱式等待所有元素加載完成,直到超過設(shè)定的最長時(shí)間
driver.find_element_by_id("element_id").click()

顯示等待 相比隱式等待更靈活,是先設(shè)定一個(gè)條件函數(shù)和一個(gè)最長等待時(shí)長芹扭,輪詢判斷條件函數(shù)的返回值麻顶,如果返回 True,則開始執(zhí)行后面的操作舱卡,否則會(huì)一直等待辅肾,直到超時(shí)報(bào)元素未找到異常。

Selenium 中使用 expected_conditions 指定了很多條件函數(shù)(也可以自定義條件函數(shù))轮锥,具體可以參考官網(wǎng)宛瞄。

# 使用方式
# 指定超時(shí)時(shí)間和條件函數(shù)
WebDriverWait(driver,timeout).until(method)

比如:下面就是輪詢等待 10s,直到頁面元素可見交胚。

# 顯示等待 10s份汗,直到元素出現(xiàn)
element = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((By.ID, "element_id"))
)

上面的 3 種等待,顯式等待和隱式等待使用更常見蝴簇;隱式等待針對全局杯活,可以動(dòng)態(tài)的設(shè)置等待時(shí)長;顯式等待最靈活熬词,可以最大程度地提高測試用例的執(zhí)行效率旁钧。

4. 內(nèi)嵌頁面

有一些復(fù)雜的網(wǎng)頁會(huì)包含 iframe HTML 內(nèi)聯(lián)框架元素吸重,WebDriver API 是沒法直接找到 iframe 表單內(nèi)嵌頁面的元素。

如果想定位到內(nèi)嵌頁面的元素歪今,可以使用 switch_to_frame( frame_id/frame) 切換到對應(yīng)的 iframe 嚎幸,然后再去查找內(nèi)部元素。

# 使用 iframe 的 id 或者 iframe 對象切換到 iframe
driver.switch_to.frame("frame_id")
driver.switch_to.frame(target_frame)

# 然后再查找 iframe 內(nèi)部元素
driver.find_element_by_name("pwd").send_keys("******")

操作完 iframe 之后寄猩,使用 switch_to.default_content() 切換到外層頁面嫉晶,繼續(xù)后面的操作。

# 切換到外層頁面
driver.switch_to.default_content()

需要注意的是田篇,針對多層 iframe 嵌套替废,需要一層一層地切換 iframe,操作完對應(yīng) iframe 內(nèi)部操作之后泊柬,返回到最外層頁面椎镣。

比如:iframeA- iframeB - iframeC,要查找 iframeC 內(nèi)部元素控件

# 切換到第一層
driver.switch_to.frame("iframeA")

# 切換到第二層
driver.switch_to.frame("iframeB")

切換到第三層
edriver.switch_to.frame("iframeC")

# 操作第三層元素
....

# 切換到最外層元素
driver.switch_to.default_content()

5. 窗口切換

有時(shí)候兽赁,點(diǎn)擊網(wǎng)頁內(nèi)部某個(gè)鏈接状答,會(huì)打開一個(gè)新的窗口,實(shí)際上刀崖,每一個(gè)窗口都有特定的窗口句柄:window_handle剪况。

獲取當(dāng)前窗口頁面的窗口句柄:current_window_handle。

獲取所有窗口頁面的窗口句柄:window_handles蒲跨,返回值是一個(gè)窗口句柄列表译断。

要操作某一個(gè)窗口內(nèi)的元素,首先要使用 switch_to_window() 切換到對應(yīng)的窗口或悲,然后才能操作內(nèi)部元素孙咪。

# 獲取當(dāng)前窗口的句柄
window_handle_main = driver.current_window_handle

# 跳到其他窗口界面
...

# 獲取所有的窗口句柄
window_handles = driver.window_handles

# 其他窗口的句柄
window_handle_other = None

# 遍歷找到注冊窗口句柄
for handle in window_handles:
    if handle != window_handle_main:
        # 其他窗口句柄
        window_handle_other = handle

        # 切換到第二個(gè)窗口內(nèi)
        driver.switch_to.window(window_handle_other)

        # 第二個(gè)窗口內(nèi)部操作
        ......

        # 關(guān)閉當(dāng)前窗口,即第二個(gè)窗口頁面
        driver.close()

# 切換到主窗口
driver.switch_to.window(window_handle_main)

6. 特殊元素

針對網(wǎng)頁中的一些特殊網(wǎng)頁元素巡语,比如:JS 警告對話框翎蹈、下拉選項(xiàng),Selenium 都提供了對應(yīng)的 API男公,方便我們快速地進(jìn)行處理荤堪。

警告對話框 會(huì)在窗口上浮動(dòng)彈出一個(gè)警告對話框,WebDriver 使用 switch_to.alert() 切換到對話框本身枢赔,然后就能操作對話框了澄阳。

常見操作包含:獲取對話框文本內(nèi)容、同意對話框踏拜、關(guān)閉對話框碎赢,如果對話框內(nèi)存在輸入框的話,還可以使用 send_keys() 輸入內(nèi)容速梗。

# 切換到對話框
dialog_alert = driver.switch_to.alert

# 獲取警告框的提示信息
acontent = dialog_alert.text

# 對話框的操作
# 操作包含 accept()肮塞、dismiss()襟齿、send_keys()
dialog_alert.accept()

下拉選項(xiàng) Select 也是比較常用的網(wǎng)頁元素,要模擬選擇某一項(xiàng)值枕赵,需要借助 WebDriver 提供的 Select 類套菜。

Select 類可以通過 索引剖张、文本內(nèi)容俱尼、value 屬性值 來模擬選擇下拉選項(xiàng)的某一項(xiàng)绷蹲。

?from selenium.webdriver.support.select import Select

# 下拉選項(xiàng)元素
element_select = driver.find_element_by_xpath("http://select[@id='select_id']")

# 利用 Select 類進(jìn)行選擇
# 1耕拷、通過value來選擇
Select(element_select).select_by_value(element_value)

# 2造垛、通過索引來選擇
# Select(element_select).select_by_index(element_index)

# 3限番、通過內(nèi)容來選擇
Select(element_select).select_by_visible_text(element_text)

更多自動(dòng)化相關(guān)的干貨可以關(guān)注微信公眾號【 Python 自動(dòng)化社區(qū) 】來解鎖民傻。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末弓熏,一起剝皮案震驚了整個(gè)濱河市恋谭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挽鞠,老刑警劉巖疚颊,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異信认,居然都是意外死亡材义,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門嫁赏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來其掂,“玉大人,你說我怎么就攤上這事潦蝇】畎荆” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵攘乒,是天一觀的道長贤牛。 經(jīng)常有香客問我,道長则酝,這世上最難降的妖魔是什么殉簸? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮沽讹,結(jié)果婚禮上般卑,老公的妹妹穿的比我還像新娘。我一直安慰自己爽雄,他們只是感情好椭微,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盲链,像睡著了一般蝇率。 火紅的嫁衣襯著肌膚如雪迟杂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天本慕,我揣著相機(jī)與錄音排拷,去河邊找鬼。 笑死锅尘,一個(gè)胖子當(dāng)著我的面吹牛监氢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播藤违,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼浪腐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了顿乒?” 一聲冷哼從身側(cè)響起议街,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎璧榄,沒想到半個(gè)月后特漩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骨杂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年涂身,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搓蚪。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛤售,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妒潭,到底是詐尸還是另有隱情悍抑,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布杜耙,位于F島的核電站搜骡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏佑女。R本人自食惡果不足惜记靡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望团驱。 院中可真熱鬧摸吠,春花似錦、人聲如沸嚎花。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽紊选。三九已至啼止,卻和暖如春道逗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背献烦。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工滓窍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人巩那。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓吏夯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親即横。 傳聞我的和親對象是個(gè)殘疾皇子噪生,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容