Web自動化之Selenium常用操作方法大全
本文總結(jié)使用selenium進行web/UI自動化時,會用到的一些常用操作。
定位元素
driver.find_element_by_xpath()#1、絕對路徑 2、元素屬性 3、層級和屬性結(jié)合 4、使用邏輯運算符
driver.find_element_by_id()#根據(jù)id定位,HTML規(guī)定id屬性在HTML文檔中必須是唯一的
driver.find_element_by_name()#name屬性定位
driver.find_element_by_class_name()#class屬性定位
driver.find_element_by_tag_name()#標(biāo)簽名字定位 因為標(biāo)簽基本都不是唯一的,所以不用這個
driver.find_element_by_link_text()#定位文本鏈接,需要對應(yīng)的元素有href屬性
driver.find_element_by_partial_link_text()#模糊定位文本鏈接
driver.find_element_by_css_selector()#CSS選擇器
By定位元素
是元素定位另外一種方式,跟上面的8種底層一樣。
from selenium.webdriver.common import By driver.find_element(By.ID,'kw')
定位一組元素
driver.find_elements_by_xpath()#其他方法同理 driver.find_elements(By.XPATH,'')
瀏覽器操作
driver.set_window_size()#設(shè)置瀏覽器大小,可以設(shè)置成移動端大小
driver.back()#瀏覽器后退
driver.forward()#瀏覽器前進
driver.set_window_position()
driver.set_window_rect()
driver.refresh()#模擬瀏覽器刷新
driver.maximize_window()#最大化瀏覽器
設(shè)置瀏覽器參數(shù)
在定義driver的時候設(shè)置chrome_options參數(shù),該參數(shù)是一個Options類所實例化的對象。其中,常用的參數(shù)是設(shè)置瀏覽器是否可視化和瀏覽器的請求頭等信息,前者可以加快代碼的運行速度,后者可以有效地防止網(wǎng)站的反爬蟲檢測
from selenium.webdriver.chrome.options import Options url='https://movie.douban.com/' #Options類實例化 chrome_options=Options() #設(shè)置瀏覽器參數(shù) #--headless是不 顯示瀏覽器啟動和執(zhí)行過程c chrome_options.add_argument('--headless') #設(shè)置lang和User-Agent信息,防止反爬蟲檢測 chrome_options.add_argument('lang=zh_CN.UTF-8') UserAgent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.101 Safari/537.36' chrome_options.add_argument('User-Agent='+UserAgent) #啟動瀏覽器并設(shè)置chrome_options參數(shù) driver=webdriver.Chrome(options=chrome_options) driver.get(url) driver.maximize_window() print(driver.title) # print(driver.page_source) #獲取網(wǎng)頁的html代碼
元素操作
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()#提交輸入框的內(nèi)容 類似于回車提交搜索框內(nèi)容
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()#返回元素是否用戶可見
鼠標(biāo)事件
關(guān)于鼠標(biāo)操作的方法都封裝在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()#鼠標(biāo)懸停
ActionChains(driver).double_click(rigt_check).perform()#鼠標(biāo)雙擊
ActionChains(driver).drag_and_drop(source,target).perform()#鼠標(biāo)由源元素拖動至目標(biāo)元素
url='https://passport.bilibili.com/login' driver=webdriver.Chrome() driver.get(url) #雙擊登錄按鈕 ele=driver.find_element_by_class_name('tit') ActionChains(driver).double_click(ele).perform() sleep(2) #拖拽滑塊 ele=driver.find_element_by_class_name('gt_slider_knob,gt_show') ActionChains(driver).drag_and_drop_by_offset(ele,100,0).perform()
鍵盤事件
模擬鍵盤輸入,可以是按鍵,組合鍵。
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全選輸入框內(nèi)容
driver.find_element_by_xpath().send_keys(Keys.CONTROL,'x')#ctrl+x剪切輸入框內(nèi)容
driver.find_element_by_xpath().send_keys(Keys.CONTROL,'v')#ctrl+v粘貼內(nèi)容到輸入框
driver.find_element_by_xpath().send_keys(Keys.ENTER)#通過回車鍵代替單擊操作
driver.find_element_by_xpath().send_keys(Keys.F1)#鍵盤F1
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from time import sleep url='https://www.baidu.com' driver=webdriver.Chrome() driver.get(url) ele=driver.find_element_by_id('kw') ele.send_keys("selenium") sleep(2) #刪除最后一個文字 ele.send_keys(Keys.BACK_SPACE) sleep(2) #添加空格鍵+教程 ele.send_keys(Keys.SPACE) ele.send_keys("教程") sleep(2) #ctrl+a全選輸入框內(nèi)容 ele.send_keys(Keys.CONTROL,'a') sleep(2) #ctrl+x 剪切輸入框內(nèi)容 ele.send_keys(Keys.CONTROL,'x') sleep(2) #ctrl+v 粘貼內(nèi)容到輸入框 ele.send_keys(Keys.CONTROL,'v') sleep(2) #回車鍵代替單擊 driver.find_element_by_id('su').send_keys(Keys.ENTER)
獲得驗證信息
自動化用例執(zhí)行完成后,可以從頁面上獲取一些信息來證明用例執(zhí)行成功或者失敗
driver.title #獲得頁面title
driver.current_url#獲得頁面curl
driver.find_element_by_xpath().text#獲取元素文本
元素等待
由于web頁面多數(shù)使用AJAX技術(shù),瀏覽器在加載頁面時,頁面上的元素可能不是同時被加載完成的,需要加入等待。
顯式等待:顯性等待能夠根據(jù)判斷條件而靈活地等待,程序每隔一段時間檢測一次,如果檢測結(jié)果與條件相符,就執(zhí)行下一步,否則繼續(xù)等待,直到超過設(shè)置的最長時間為止
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提供了很多預(yù)期條件判斷方法
#也可以用is_displayed()判斷元素是否可見
隱式等待
隱性等待是指在一個設(shè)定的時間內(nèi)檢測網(wǎng)頁是否加載完成,也就是一般情況下用戶看到瀏覽器標(biāo)簽欄那個小圈不再轉(zhuǎn),才會執(zhí)行下一步。比如代碼中設(shè)置30秒等待時間,網(wǎng)頁只要在30秒內(nèi)完成加載就會自動執(zhí)行下一步,如果超出30秒就會拋出異常。值得注意的是,隱性等待對整個driver的周期都起作用,所以只要設(shè)置一次即可。
通過一定的時長等待頁面上某元素加載完成,如果超出了設(shè)置的時長元素,還沒有被加載,則拋出沒有元素異常。
通常設(shè)置在driver后面。
driver.implicitly_wait(10)
sleep休眠方法
在需要的地方添加。
from time import sleep sleep(3)
隱性等待和顯性等待相比于time.sleep這種強制等待更為靈活和智能,可解決各種網(wǎng)絡(luò)延誤的問題,隱性等待和顯性等待可以同時使用,但最長的等待時間取決于兩者之間的最大數(shù),如上述代碼的隱性等待時間為30秒,顯性等待時間為20秒,則該代碼的最長等待時間為隱性等待時間。
多框架切換
frame是一個框架頁面,在HTML 5中已經(jīng)不支持使用框架,但在一些網(wǎng)站中依然會看到它的身影。frame的作用是在HTML代碼中嵌套一個或多個不同的HTML代碼,每嵌套一個HTML代碼都需要由frame來實現(xiàn)
iframe和frame實現(xiàn)的功能是相同的,只不過使用方式和靈活性有所不同,無論是iframe還是frame,Selenium的定位和操作方式都是一樣的
由于一個HTML可以嵌套一個或多個iframe,因此Selenium在操作不同的iframe時需要通過switch_to.frame()來切換到指定的iframe,再執(zhí)行相應(yīng)的操作
driver.switch_to.frame('kw')#可以直接取表單的id或者name屬性,如果表單沒有這兩個屬性,可以先定位表單元素,再切換
driver.switch_to.parent_frame('kw')#跳出當(dāng)前一級表單
driver.switch_to.default_content('kw')#跳回最外層頁面
#根據(jù)索引定位
driver.switch_to_frame(0)
#根據(jù)id或者name屬性
driver.switch_to_frame('framea')
新版本 driver.switch_to.frame(0)
如百度知道的文本框
如下代碼實現(xiàn)打開百度知道題目頁面,點擊我要回答,定位至iframe,輸入內(nèi)容,跳出iframe,并點擊提交回答按鈕
url='https://zhidao.baidu.com/question/1903337615241287780.html' driver=webdriver.Chrome() driver.get(url) driver.maximize_window() #點擊我要回答 driver.find_element_by_id('answer-bar').click() #切換到frame內(nèi)部的html driver.switch_to.frame('ueditor_0') #定位frame內(nèi)部的元素 driver.find_element_by_xpath('/html/body').send_keys('美國') #跳回網(wǎng)頁HTML 如果不切回網(wǎng)頁,則找不到提交回答按鈕,且js代碼也執(zhí)行不了 # driver.switch_to.default_content() js='window.scrollTo(0,100)' driver.execute_script(js) sleep(3) #點擊網(wǎng)頁提交回答按鈕 driver.find_element_by_xpath("http://div[@class='addons line']/a").click()
多窗口切換
search_windows=driver.current_window_handle #獲得當(dāng)前窗口句柄
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])
應(yīng)用
from selenium import webdriver from selenium.webdriver.common.by import By url='https://www.baidu.com/' driver=webdriver.Chrome() driver.get(url) driver.implicitly_wait(10) search_windows=driver.current_window_handle #獲得窗口句柄 driver.find_element_by_link_text('登錄').click() driver.find_element_by_link_text('立即注冊').click() import time #獲得所有窗口的句柄 all_handles=driver.window_handles #切換到注冊窗口 for handle in all_handles: if handle!=search_windows: driver.switch_to.window(handle) print("當(dāng)前是注冊窗口") time.sleep(2) #回到搜索窗口 for handle in all_handles: if handle==search_windows: driver.switch_to.window(handle) print("當(dāng)前是搜索窗口") driver.find_element_by_id('TANGRAM__PSP_4__closeBtn').click()#關(guān)閉注冊窗口 driver.find_element_by_id('kw').send_keys("selenium") driver.find_element_by_id('su').click() time.sleep(2) driver.quit()
警告框處理
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ā)送文本至警告框
應(yīng)用,如圖切換至alert并接受
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By from time import sleep url='https://www.baidu.com/' driver=webdriver.Chrome() driver.get(url) driver.maximize_window() driver.implicitly_wait(10) #鼠標(biāo)懸停至設(shè)置鏈接 link=driver.find_element_by_id("s-usersetting-top") ActionChains(driver).move_to_element(link).perform() driver.find_element_by_link_text('搜索設(shè)置').click() #保存設(shè)置 driver.find_element_by_class_name('prefpanelgo').click() sleep(2) #接受警告框 # driver.switch_to_alert().accept() driver.quit()
上傳文件
一般文件上傳,是打開windows窗口從窗口中選擇本地文件,但webdriver無法操作windows控件。
1、普通上傳 將本地文件路徑作為值傳給input標(biāo)簽,注意必須是input標(biāo)簽
2、插件上傳,基于flash,js,Ajax等技術(shù)實現(xiàn)上傳
#定位上傳按鈕,添加本地文件
driver.find_element_by_name('file').send_keys("D:\\upload_file.txt")
另一種方法為基于AutoIt軟件來實現(xiàn)上傳。但是不推薦,因為不在Python范圍。
下載文件
webdriver允許設(shè)置默認(rèn)的文件下載路徑,文件會被自動下載并存放到設(shè)置的目錄中
操作cookie
什么情況下回用到cookie操作?當(dāng)開發(fā)人員開發(fā)一個功能,當(dāng)用戶登錄后,會將用戶的用戶名寫入瀏覽器cookie,指定key為username,就可以通過get_cookies()找到username,打印value。
url='https://www.youdao.com/' driver=webdriver.Chrome() driver.get(url) driver.maximize_window() driver.implicitly_wait(10) # #獲得cookie driver.add_cookie({'name':'Login_User','value':'Password'}) cookie=driver.get_cookies() print("所有Cookie為",cookie) #獲取name為Login_User的cookie one_cookie=driver.get_cookie('Login_User') print("Login_User的Cookie為",one_cookie) # "刪除name為Login_User的cookie driver.delete_cookie('Login_User') surplus_cookies=driver.get_cookies() print("剩余的cookie為:",surplus_cookies) driver.delete_all_cookies() surplus_cookies=driver.get_cookies() print("剩余的cookie為:",surplus_cookies) driver.quit()
返回結(jié)果為
所有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為: []
調(diào)用Javascript
可以用來控制瀏覽器滾動條
url='https://www.baidu.com/' driver=webdriver.Chrome() driver.get(url) driver.find_element_by_id('kw').send_keys("selenium") driver.find_element_by_id('su').click() driver.set_window_size(600,600) #通過js設(shè)置瀏覽器窗口的滾動條位置 js="window.scrollTo(500,500);" driver.execute_script(js)
窗口截圖
url='https://www.baidu.com/' driver=webdriver.Chrome() driver.get(url) driver.find_element_by_id('kw').send_keys("selenium") driver.find_element_by_id('su').click() sleep(2) driver.get_screenshot_as_file("C:\\Users\\yangyl13\\Desktop\\3.png") driver.quit()
關(guān)閉窗口
driver.quit() #退出相關(guān)驅(qū)動程序,關(guān)閉所有窗口
driver.close()#關(guān)閉單個窗口。
驗證碼處理
1、測試環(huán)境去掉驗證碼
2、萬能驗證碼
3、驗證碼識別技術(shù) 如python-tesseract
4、記錄cookie
下拉框選擇
from selenium.webdriver.support.select import Select
Select(driver.find_element_by_id('')).select_by_index('2')#根據(jù)下拉框索引選擇
Select(driver.find_element_by_id('')).select_by_value('Python')#根據(jù)下拉框value屬性選擇
Select(driver.find_element_by_id('')).select_by_visible_text('Python')#根據(jù)下拉框可見文本選擇
總結(jié)
到此這篇關(guān)于Web自動化之Selenium常用操作方法大全的文章就介紹到這了,更多相關(guān)Web自動化Selenium常用操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python Pandas創(chuàng)建Dataframe數(shù)據(jù)框的六種方法匯總
這篇文章主要介紹了Python中的Pandas創(chuàng)建Dataframe數(shù)據(jù)框的六種方法,創(chuàng)建Dataframe主要是使用pandas中的DataFrame函數(shù),其核心就是第一個參數(shù):data,傳入原始數(shù)據(jù),因此我們可以據(jù)此給出六種創(chuàng)建Dataframe的方法,需要的朋友可以參考下2023-05-05Python torch.flatten()函數(shù)案例詳解
這篇文章主要介紹了Python torch.flatten()函數(shù)案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08解決linux下使用python打開terminal時報錯的問題
這篇文章主要介紹了linux下使用python打開terminal時報錯,本文通過兩種場景分析給大家詳細講解,需要的朋友可以參考下2023-03-03Python3實現(xiàn)英文字母轉(zhuǎn)換哥特式字體實例代碼
這篇文章主要給大家介紹了關(guān)于Python3實現(xiàn)英文字母轉(zhuǎn)換哥特式字體的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09使用anaconda的pip安裝第三方python包的操作步驟
今天小編就為大家分享一篇使用anaconda的pip安裝第三方python包的操作步驟,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06詳解pytest中runtestprotocol方法的實現(xiàn)
runtestprotocol 是 pytest 執(zhí)行測試流程中的一個核心函數(shù),它主要負(fù)責(zé)調(diào)用測試函數(shù)的“setup”、“call”和“teardown”鉤子函數(shù),并生成對應(yīng)的測試報告,本文將深入探究pytest中runtestprotocol方法的實現(xiàn),需要的朋友可以參考下2023-10-10