本文總結使用selenium進行web/UI自動化時,會用到的一些常用操作。
定位元素
driver.find_element_by_xpath()#1、絕對路徑 2、元素屬性 3、層級和屬性結合 4、使用邏輯運算符
driver.find_element_by_id()#根據id定位,HTML規(guī)定id屬性在HTML文檔中必須是唯一的
driver.find_element_by_name()#name屬性定位
driver.find_element_by_class_name()#class屬性定位
driver.find_element_by_tag_name()#標簽名字定位 因為標簽基本都不是唯一的,所以不用這個
driver.find_element_by_link_text()#定位文本鏈接,需要對應的元素有href屬性
driver.find_element_by_partial_link_text()#模糊定位文本鏈接
driver.find_element_by_css_selector()#CSS選擇器
By定位元素
是元素定位另外一種方式,跟上面的8種底層一樣。
1 2 |
|
定位一組元素
1 2 |
|
瀏覽器操作
driver.set_window_size()#設置瀏覽器大小,可以設置成移動端大小
driver.back()#瀏覽器后退
driver.forward()#瀏覽器前進
driver.set_window_position()
driver.set_window_rect()
driver.refresh()#模擬瀏覽器刷新
driver.maximize_window()#最大化瀏覽器
設置瀏覽器參數
在定義driver的時候設置chrome_options參數,該參數是一個Options類所實例化的對象。其中,常用的參數是設置瀏覽器是否可視化和瀏覽器的請求頭等信息,前者可以加快代碼的運行速度,后者可以有效地防止網站的反爬蟲檢測
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
元素操作
driver.find_element_by_xpath().click()#點擊元素
driver.find_element_by_xpath().clear()#清空文本
driver.find_element_by_xpath().send_keys()#模擬鍵盤輸入
頁面交互
webElement接口提供了一些可以與頁面交互的方法
submit和click在某些情況下可以互換,submit只用于表單的提交按鈕。
driver.find_element_by_xpath().submit()#提交輸入框的內容 類似于回車提交搜索框內容
driver.find_element_by_xpath().size#返回元素尺寸
driver.find_element_by_xpath().text#獲取元素文本
driver.find_element_by_xpath().get_attribute()#獲取元素屬性值
driver.find_element_by_xpath().is_selected()#是否被選中
driver.find_element_by_xpath().is_enabled()#判斷元素是否可以使用
driver.find_element_by_xpath().is_displayed()#返回元素是否用戶可見
鼠標事件
關于鼠標操作的方法都封裝在Actionchains中
from selenium.webdriver.common.action_chains import ActionChains
rigt_check=driver.find_element_by_id('kw')
ActionChains(driver).context_click(rigt_check).perform()#context_click對元素右擊操作
#perform()執(zhí)行所有ActionChains中存儲的行為
ActionChains(driver).move_to_element(rigt_check).perform()#鼠標懸停
ActionChains(driver).double_click(rigt_check).perform()#鼠標雙擊
ActionChains(driver).drag_and_drop(source,target).perform()#鼠標由源元素拖動至目標元素
1 2 3 4 5 6 7 8 9 10 11 |
|
鍵盤事件
模擬鍵盤輸入,可以是按鍵,組合鍵。
from selenium.webdriver.common.keys import Keys
driver.find_element_by_xpath().send_keys(Keys.BACK_SPACE)#對該元素操作一次backspace
driver.find_element_by_xpath().send_keys(Keys.SPACE)#對該元素輸入空格
driver.find_element_by_xpath().send_keys(Keys.CONTROL,'a')#ctrl+A全選輸入框內容
driver.find_element_by_xpath().send_keys(Keys.CONTROL,'x')#ctrl+x剪切輸入框內容
driver.find_element_by_xpath().send_keys(Keys.CONTROL,'v')#ctrl+v粘貼內容到輸入框
driver.find_element_by_xpath().send_keys(Keys.ENTER)#通過回車鍵代替單擊操作
driver.find_element_by_xpath().send_keys(Keys.F1)#鍵盤F1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
獲得驗證信息
自動化用例執(zhí)行完成后,可以從頁面上獲取一些信息來證明用例執(zhí)行成功或者失敗
driver.title #獲得頁面title
driver.current_url#獲得頁面curl
driver.find_element_by_xpath().text#獲取元素文本
元素等待
由于web頁面多數使用AJAX技術,瀏覽器在加載頁面時,頁面上的元素可能不是同時被加載完成的,需要加入等待。
顯式等待:顯性等待能夠根據判斷條件而靈活地等待,程序每隔一段時間檢測一次,如果檢測結果與條件相符,就執(zhí)行下一步,否則繼續(xù)等待,直到超過設置的最長時間為止
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element=WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located(By.ID,'kw'))
#每0.5秒檢測一次這個元素能否被定位到,5秒后超時
#expected_conditions提供了很多預期條件判斷方法
#也可以用is_displayed()判斷元素是否可見
隱式等待
隱性等待是指在一個設定的時間內檢測網頁是否加載完成,也就是一般情況下用戶看到瀏覽器標簽欄那個小圈不再轉,才會執(zhí)行下一步。比如代碼中設置30秒等待時間,網頁只要在30秒內完成加載就會自動執(zhí)行下一步,如果超出30秒就會拋出異常。值得注意的是,隱性等待對整個driver的周期都起作用,所以只要設置一次即可。
通過一定的時長等待頁面上某元素加載完成,如果超出了設置的時長元素,還沒有被加載,則拋出沒有元素異常。
通常設置在driver后面。
driver.implicitly_wait(10)
sleep休眠方法
在需要的地方添加。
1 2 |
|
隱性等待和顯性等待相比于time.sleep這種強制等待更為靈活和智能,可解決各種網絡延誤的問題,隱性等待和顯性等待可以同時使用,但最長的等待時間取決于兩者之間的最大數,如上述代碼的隱性等待時間為30秒,顯性等待時間為20秒,則該代碼的最長等待時間為隱性等待時間。?
多框架切換
frame是一個框架頁面,在HTML 5中已經不支持使用框架,但在一些網站中依然會看到它的身影。frame的作用是在HTML代碼中嵌套一個或多個不同的HTML代碼,每嵌套一個HTML代碼都需要由frame來實現(xiàn)
iframe和frame實現(xiàn)的功能是相同的,只不過使用方式和靈活性有所不同,無論是iframe還是frame,Selenium的定位和操作方式都是一樣的
由于一個HTML可以嵌套一個或多個iframe,因此Selenium在操作不同的iframe時需要通過switch_to.frame()來切換到指定的iframe,再執(zhí)行相應的操作?
driver.switch_to.frame('kw')#可以直接取表單的id或者name屬性,如果表單沒有這兩個屬性,可以先定位表單元素,再切換
driver.switch_to.parent_frame('kw')#跳出當前一級表單
driver.switch_to.default_content('kw')#跳回最外層頁面
#根據索引定位
driver.switch_to_frame(0)
#根據id或者name屬性
driver.switch_to_frame('framea')
新版本 driver.switch_to.frame(0)
如百度知道的文本框
?
?如下代碼實現(xiàn)打開百度知道題目頁面,點擊我要回答,定位至iframe,輸入內容,跳出iframe,并點擊提交回答按鈕
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
多窗口切換
search_windows=driver.current_window_handle #獲得當前窗口句柄
all_handles=driver.window_handles #獲得所有窗口的句柄
driver.switch_to.window(handle)#切換窗口
handles=driver.window_handles
driver.switch_to_window(handles[0])
driver.switch_to_window(handles[1])
應用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
警告框處理
webdriver中處理JavaScript生成的alert,confirm,prompt十分簡單,具體做法是使用switch_to_alert方法定位到alert/confirm/prompt,然后使用text/accept/dismiss/send_keys等方法進行操作。
- text:返回alert/confirm/prompt中的文字信息
- accept():接受現(xiàn)有警告框
- dismiss():解散現(xiàn)有警告框
- send_keys:發(fā)送文本至警告框
應用,如圖切換至alert并接受
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
上傳文件
一般文件上傳,是打開windows窗口從窗口中選擇本地文件,但webdriver無法操作windows控件。
1、普通上傳 將本地文件路徑作為值傳給input標簽,注意必須是input標簽
2、插件上傳,基于flash,js,Ajax等技術實現(xiàn)上傳
#定位上傳按鈕,添加本地文件
driver.find_element_by_name('file').send_keys("D:\\upload_file.txt")
另一種方法為基于AutoIt軟件來實現(xiàn)上傳。但是不推薦,因為不在Python范圍。
下載文件
webdriver允許設置默認的文件下載路徑,文件會被自動下載并存放到設置的目錄中
操作cookie
什么情況下回用到cookie操作?當開發(fā)人員開發(fā)一個功能,當用戶登錄后,會將用戶的用戶名寫入瀏覽器cookie,指定key為username,就可以通過get_cookies()找到username,打印value。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
返回結果為
所有Cookie為[{
?? ?'domain': 'www.youdao.com',
?? ?'httpOnly': False,
?? ?'name': '___rl__test__cookies',
?? ?'path': '/',
?? ?'secure': False,
?? ?'value': '1662293521877'
}, {
?? ?'domain': '.youdao.com',
?? ?'expiry': 1696853521,
?? ?'httpOnly': False,
?? ?'name': 'OUTFOX_SEARCH_USER_ID',
?? ?'path': '/',
?? ?'secure': False,
?? ?'value': '"555592633@10.108.162.135"'
}, {
?? ?'domain': 'www.youdao.com',
?? ?'httpOnly': False,
?? ?'name': 'Login_User',
?? ?'path': '/',
?? ?'secure': True,
?? ?'value': 'Password'
}, {
?? ?'domain': '.youdao.com',
?? ?'expiry': 1696853520,
?? ?'httpOnly': False,
?? ?'name': 'OUTFOX_SEARCH_USER_ID_NCOO',
?? ?'path': '/',
?? ?'secure': False,
?? ?'value': '1883563674.2397'
}]
Login_User的Cookie為 {
?? ?'domain': 'www.youdao.com',
?? ?'httpOnly': False,
?? ?'name': 'Login_User',
?? ?'path': '/',
?? ?'secure': True,
?? ?'value': 'Password'
}
剩余的cookie為: [{
?? ?'domain': 'www.youdao.com',
?? ?'httpOnly': False,
?? ?'name': '___rl__test__cookies',
?? ?'path': '/',
?? ?'secure': False,
?? ?'value': '1662293521877'
}, {
?? ?'domain': '.youdao.com',
?? ?'expiry': 1696853521,
?? ?'httpOnly': False,
?? ?'name': 'OUTFOX_SEARCH_USER_ID',
?? ?'path': '/',
?? ?'secure': False,
?? ?'value': '"555592633@10.108.162.135"'
}, {
?? ?'domain': '.youdao.com',
?? ?'expiry': 1696853520,
?? ?'httpOnly': False,
?? ?'name': 'OUTFOX_SEARCH_USER_ID_NCOO',
?? ?'path': '/',
?? ?'secure': False,
?? ?'value': '1883563674.2397'
}]
剩余的cookie為: []
調用Javascript
可以用來控制瀏覽器滾動條
1 2 3 4 5 6 7 8 9 10 11 |
|
?
窗口截圖
1 2 3 4 5 6 7 8 9 10 |
|
關閉窗口
driver.quit() #退出相關驅動程序,關閉所有窗口
driver.close()#關閉單個窗口。
驗證碼處理
1、測試環(huán)境去掉驗證碼
2、萬能驗證碼
3、驗證碼識別技術 如python-tesseract
4、記錄cookie
下拉框選擇
from selenium.webdriver.support.select import Select
Select(driver.find_element_by_id('')).select_by_index('2')#根據下拉框索引選擇
Select(driver.find_element_by_id('')).select_by_value('Python')#根據下拉框value屬性選擇
Select(driver.find_element_by_id('')).select_by_visible_text('Python')#根據下拉框可見文本選擇
?
總結:
感謝每一個認真閱讀我文章的人?。?!
作為一位過來人也是希望大家少走一些彎路,如果你不想再體驗一次學習時找不到資料,沒人解答問題,堅持幾天便放棄的感受的話,在這里我給大家分享一些自動化測試的學習資源,希望能給你前進的路上帶來幫助。
-
文檔獲取方式:
-
加入我的軟件測試交流群:680748947免費獲取~(同行大佬一起學術交流,每晚都有大佬直播分享技術知識點)
這份文檔,對于想從事【軟件測試】的朋友來說應該是最全面最完整的備戰(zhàn)倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!文章來源:http://www.zghlxwxcb.cn/news/detail-843552.html
以上均可以分享,只需要你搜索vx公眾號:程序員雨果,即可免費領取文章來源地址http://www.zghlxwxcb.cn/news/detail-843552.html
到了這里,關于Web自動化之Selenium常用操作方法大全的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!