Selenium是一個開源、免費(fèi)、簡單、靈活,對Web瀏覽器支持良好的自動化測試工具,在UI自動化、爬蟲等場景下是十分實(shí)用的,能夠熟練掌握并使用Selenium工具可以大大的提高效率。
Selenium簡介
Selenium支持多平臺、多瀏覽器、多語言去實(shí)現(xiàn)自動化測試,是一個開源和可移植的Web測試框架,支持并行測試執(zhí)行,從而減少了時間并提高了測試效率。利用它,我們可以編寫相關(guān)的自動化程序,讓程序完全像人一樣在瀏覽器里面操作Web界面,比如模擬鼠標(biāo)點(diǎn)擊、模擬鍵盤輸入等等。不但能夠操作Web界面,還能從Web中獲取信息,并且相對來說,使用Selenium來獲取信息更加簡單,它的基本原理是我們編寫自動化程序之后利用瀏覽器驅(qū)動直接對瀏覽器進(jìn)行操作,只要我們用戶能在瀏覽器上獲得的信息使用Selenium都可以獲得。
環(huán)境準(zhǔn)備
下載瀏覽器驅(qū)動,注意驅(qū)動版本與瀏覽器版本要一致
將瀏覽器驅(qū)動路徑添加到環(huán)境變量path中
安裝Selenium包pip install selenium
快速入門
使用selenium實(shí)現(xiàn)控制瀏覽器打開百度首頁,搜索Alipay。
from selenium import webdriver # 導(dǎo)入webdriver
import time
driver = webdriver.Chrome() # 獲取瀏覽器驅(qū)動
driver.get(" http://www.baidu.com") # 打開百度首頁
input_box = driver.find_element_by_id('kw') # 獲取首頁輸入框元素
input_box.send_keys('Alipay') # 向輸入框中輸入內(nèi)容
search_button = driver.find_element_by_id('su') # 獲取首頁搜索按鈕元素
search_button.click() # 點(diǎn)擊搜索按鈕
time.sleep(5)
driver.quit() # 關(guān)閉驅(qū)動
Selenium-API操作【文末免費(fèi)分享Selenium自動化測試學(xué)習(xí)資源】
元素等待
顯示等待
設(shè)置一個超時時間,每過一段時間就去檢測一次該元素是否存在,如果存在則執(zhí)行后續(xù)內(nèi)容,如果超過最大時間(超時時間)則拋出超時異常(TimeoutException)。顯示等待需要使用 WebDriverWait,同時配合 until 或 not until 。
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('Http://www.baidu.com')
# 每隔0.5秒檢測一次元素存不存在,5秒內(nèi)沒找到拋出異常
element = WebDriverWait(driver, 5, 0.5).until(
expected_conditions.presence_of_element_located((By.ID, 'kd')), message='元素未找到')
隱式等待
隱式等待也是指定一個超時時間,如果超出這個時間指定元素還沒有被加載出來,就會拋出 NoSuchElementException 異常。除了拋出的異常不同外,還有一點(diǎn),隱式等待是全局性的,即運(yùn)行過程中,如果元素可以定位到,它不會影響代碼運(yùn)行,但如果定位不到,則它會以輪詢的方式不斷地訪問元素直到元素被找到,若超過指定時間,則拋出異常。使用 implicitly_wait() 來實(shí)現(xiàn)隱式等待,使用難度相對于顯式等待要簡單很多。
driver.implicitly_wait(5)
強(qiáng)制等待
使用 time.sleep() 強(qiáng)制等待,設(shè)置固定的休眠時間,等待元素加載,對于代碼的運(yùn)行效率會有影響。
元素定位
Selenium提供了8種基本元素定位的方法,分別是id,name,class name,tag name,link text,partial link text,xpath,css selector,其中id,name,class name,tag name是根據(jù)元素的標(biāo)簽或元素的屬性來進(jìn)行定位;link text,partial link text是根據(jù)超鏈接的文本來進(jìn)行定位;xpath為元素路徑定位;css為選擇器定位(樣式定位)。
element = driver.find_element_by_id('kw') # 通過id屬性獲取元素
element = driver.find_element_by_name('wd') # 通過name屬性獲取元素
element = driver.find_element_by_class_name('input') # 通過class屬性獲取元素
element = driver.find_element_by_tag_name('input') # 通過標(biāo)簽名獲取元素
element = driver.find_element_by_link_text('視頻') # 通過鏈接文本值獲取元素
element = driver.find_element_by_partial_link_text('視')# 通過部分鏈接文本值獲取元素
element = driver.find_element_by_xpath("http://*[@id='kw']") # 通過Xpath獲取元素
element = driver.find_element_by_css_selector('#kw') # 通過CSS選擇器獲取元素
元素操作
定位到元素獲取到元素對象之后,就可以對元素進(jìn)行我們想要的操作了,Selenium提供了許多API供我們操作元素,常用的操作有點(diǎn)擊、輸入、清除、獲取元素坐標(biāo)值、獲取元素寬高值、元素屬性值、檢查元素是否被選中。
elemnet.click() # 點(diǎn)擊元素
element.send_keys('武漢') # 輸入內(nèi)容
element.clear() # 清除內(nèi)容
element.location.get('x') # 獲取元素左上角X軸坐標(biāo)
element.location.get('y') # 獲取元素左上角Y軸坐標(biāo)
element.size.get('width') # 獲取元素寬度
element.size.get('height') # 獲取元素高度
element.is_selected() # 元素是否被選中
鼠標(biāo)操作
常見的鼠標(biāo)操作有:點(diǎn)擊、右擊、雙擊、懸停、拖拽等,對于這些鼠標(biāo)操作Selenium都封裝了相應(yīng)的操作方法
在Selenium中將操作鼠標(biāo)的方法封裝在ActionChains類中,在ActionChains類中所有提供的鼠標(biāo)事件方法,在調(diào)用的時候所有的行為都存儲在ActionChains對象中,而perform()方法就是真正去執(zhí)行所有的鼠標(biāo)事件。
from selenium.webdriver.common.action_chains import ActionChains # 導(dǎo)包
actionChains = ActionChains(driver) # 實(shí)例化ActionChains對象
actionChains.move_to_element(element).perform() # 鼠標(biāo)懸停
actionChains.drag_and_drop(elementA, elementB).perform() # 鼠標(biāo)拖拽
actionChains.context_click(element).perform() # 鼠標(biāo)右擊
actionChains.double_click(element).perform() # 鼠標(biāo)雙擊
鍵盤操作
Selenium中把鍵盤的按鍵都封裝在Keys類中, 模擬鍵盤上一些按鍵或者組合鍵的輸入,使用send_Keys+http://Keys.XXX實(shí)現(xiàn)鍵盤上的組合按鍵如:Ctrl+C 、Ctrl+V。
from selenium.webdriver.common.keys import Keys # 導(dǎo)包
element.send_keys(Keys.BACK_SPACE) # 模擬按下退格鍵
element.send_keys(Keys.CONTROL, 'a') # 模擬按下Ctrl+A
element.send_keys(Keys.CONTROL, 'x') # 模擬按下Ctrl+X
element.send_keys(Keys.CONTROL, 'v') # 模擬按下Ctrl+V
瀏覽器操作
selenium同樣提供了相應(yīng)的API用于針對瀏覽器的操作,常用的有最大化瀏覽器窗口,設(shè)置瀏覽器窗口大小,設(shè)置瀏覽器的位置,控制瀏覽器前進(jìn)后退,頁面刷新。
driver.maximize_window() # 瀏覽器窗口最大化
driver.set_window_size(800, 800) # 瀏覽器窗口寬800 高800
driver.set_window_rect(300, 0) # 瀏覽器位置(300,0)
driver.back() # 瀏覽器后退
driver.forward() # 瀏覽器前進(jìn)
driver.refresh() # 刷新頁面
其他操作
標(biāo)簽頁
driver.get_screenshot_as_file('./baidu.png') # 頁面截圖
driver.close() # 關(guān)閉當(dāng)前標(biāo)簽頁
driver.quit() # 關(guān)閉所有標(biāo)簽頁
在某個頁面點(diǎn)擊鏈接打開了一個新的標(biāo)簽頁,此時selenium是無法定位到新標(biāo)簽頁的元素。這就涉及到句柄的概念了,句柄就是標(biāo)簽頁對象的唯一標(biāo)識,每個標(biāo)簽頁都有自己的句柄,可以通過句柄來實(shí)現(xiàn)標(biāo)簽頁的切換,從而定位到對應(yīng)標(biāo)簽頁的元素。
handles = driver.window_handles # 獲取所有標(biāo)簽頁的句柄
driver.switch_to.window(handles[1]) # 切換到指定句柄標(biāo)簽頁
啟動參數(shù)
Chrome Options是一個配置chrome啟動時屬性的類,通過這個參數(shù)我們可以為Chrome添加啟動參數(shù)
設(shè)置 chrome 二進(jìn)制文件位置 (binary_location)
添加啟動參數(shù) (add_argument)
添加擴(kuò)展應(yīng)用 (add_extension, add_encoded_extension)
添加實(shí)驗(yàn)性質(zhì)的設(shè)置參數(shù) (add_experimental_option)
設(shè)置調(diào)試器地址 (debugger_address)
Chrome Options常用的行為一般有以下幾種:
禁止圖片和視頻的加載:提升網(wǎng)頁加載速度。
添加代理:用于FQ訪問某些頁面,或者應(yīng)對IP訪問頻率限制的反爬技術(shù)。
使用移動頭:訪問移動端的站點(diǎn),一般這種站點(diǎn)的反爬技術(shù)比較薄弱。
添加擴(kuò)展:像正常使用瀏覽器一樣的功能。
設(shè)置編碼:應(yīng)對中文站,防止亂碼。
阻止JavaScript執(zhí)行
在UI自動化中打開瀏覽器前可以加入對瀏覽器的選項配置,通過設(shè)置不同的參數(shù),可以修改瀏覽器的默認(rèn)行為。
from selenium import webdriver
options = webdriver.ChromeOptions() # 實(shí)例化一個啟動參數(shù)對象
options.add_argument('--headless') # 設(shè)置瀏覽器瀏覽器不提供可視化頁面
options.add_argument('lang=zh_CN.UTF-8') # 設(shè)置編碼
options.add_argument('--disable-infobars') # 禁止策略化
options.add_argument('--no-sandbox') # 解決DevToolsActivePort文件不存在的報錯
options.add_argument('window-size=1920x1080') # 指定瀏覽器分辨率
options.add_argument('--disable-gpu') # 谷歌文檔提到需要加上這個屬性來規(guī)避bug
options.add_argument('--incognito') # 隱身模式(無痕模式)
options.add_argument('--disable-javascript') # 禁用javascript
options.add_argument('--start-maximized') # 最大化運(yùn)行(全屏窗口),不設(shè)置,取元素會報錯
options.add_argument('--disable-infobars') # 禁用瀏覽器正在被自動化程序控制的提示
options.add_argument('--hide-scrollbars') # 隱藏滾動條, 應(yīng)對一些特殊頁面
options.add_argument('blink-settings=imagesEnabled=false') # 不加載圖片, 提升速度
options.add_argument('User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36
') # 設(shè)置UA請求頭
driver = webdriver.Chrome(chrome_options=options)
執(zhí)行JS腳本
有些情況下,selenium提供的API無法完成對應(yīng)的操作或者操作比較麻煩,此時可以借助JS腳本來實(shí)現(xiàn),例如執(zhí)行滑動滾動條。
js ='window.scrollTo(0,100)' # 要執(zhí)行的JS腳本語句
driver.execute_script(js) # 執(zhí)行JS腳本
Frame切換
通常大多數(shù)網(wǎng)站頁面都會使用到frame嵌套,這時即使frame嵌套頁面的內(nèi)容展示出來了,我們依然無法直接定位到frame里的元素,例如像優(yōu)酷這種登錄窗口
?此時若想操作frame里的元素,需要先切換到frame里再進(jìn)行定位。
driver.switch_to.frame('alibaba-login-box') # 且換到指定frame
driver.switch_to.default_content() # 切回默認(rèn)頁面
隱藏指紋特征
使用slenium啟動的瀏覽器,大多數(shù)都會被網(wǎng)站通過一些指紋特征監(jiān)測到,識別到爬蟲行為,就會拒絕selenium的操作,如何避免這種情況,關(guān)鍵點(diǎn)在于如何在瀏覽器檢測之前將這些特征進(jìn)行隱藏,事實(shí)上,前人已經(jīng)為我們鋪好了路,解決這個問題的關(guān)鍵,實(shí)際就是一個 stealth.min.js 文件,這個文件是給 puppeteer 用的,在 Python 中使用的話需要單獨(dú)執(zhí)行這個文件,該文件獲取方式需要安裝 node.js ,終端執(zhí)行 npx extract-stealth-evasions下載該文件,并在操作瀏覽器前加上如下代碼。
with open('stealth.min.js') as f: js = f.read() driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {'source': js})
結(jié)語
本文只是簡單的介紹了selenium+python的安裝使用,以及一些基礎(chǔ)常用的API操作,還有很多高級操作、用法需要更深入的了解學(xué)習(xí)。實(shí)際運(yùn)用的話可能還需要與其他框架、工具整合使用,這些都是需要經(jīng)過更深層次的理解與學(xué)習(xí)。文章來源:http://www.zghlxwxcb.cn/news/detail-764759.html
Python接口自動化測試零基礎(chǔ)入門到精通(2023最新版)文章來源地址http://www.zghlxwxcb.cn/news/detail-764759.html
到了這里,關(guān)于Selenium介紹及基本使用方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!