系列導(dǎo)讀
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ū) 】來解鎖民傻。