自動化測試工具-selenium介紹及基本使用方法

Selenium是一個開源、免費、簡單、靈活,對Web瀏覽器支持良好的自動化測試工具,在UI自動化、爬蟲等場景下是十分實用的,能夠熟練掌握并使用Selenium工具可以大大的提高效率。

Selenium簡介

Selenium支持多平臺、多瀏覽器、多語言去實現(xiàn)自動化測試,是一個開源和可移植的Web測試框架,支持并行測試執(zhí)行,從而減少了時間并提高了測試效率。利用它,我們可以編寫相關的自動化程序,讓程序完全像人一樣在瀏覽器里面操作Web界面,比如模擬鼠標點擊、模擬鍵盤輸入等等。不但能夠操作Web界面,還能從Web中獲取信息,并且相對來說,使用Selenium來獲取信息更加簡單,它的基本原理是我們編寫自動化程序之后利用瀏覽器驅(qū)動直接對瀏覽器進行操作,只要我們用戶能在瀏覽器上獲得的信息使用Selenium都可以獲得。


環(huán)境準備

下載瀏覽器驅(qū)動,注意驅(qū)動版本與瀏覽器版本要一致

將瀏覽器驅(qū)動路徑添加到環(huán)境變量path中

安裝Selenium包pip install selenium

快速入門

使用selenium實現(xiàn)控制瀏覽器打開百度首頁,搜索Alipay。

from selenium import webdriver? ? # 導入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() # 點擊搜索按鈕

time.sleep(5)

driver.quit() # 關閉驅(qū)動

Selenium-API操作

元素等待

顯示等待

設置一個超時時間,每過一段時間就去檢測一次該元素是否存在,如果存在則執(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 異常。除了拋出的異常不同外,還有一點,隱式等待是全局性的,即運行過程中,如果元素可以定位到,它不會影響代碼運行,但如果定位不到,則它會以輪詢的方式不斷地訪問元素直到元素被找到,若超過指定時間,則拋出異常。使用 implicitly_wait() 來實現(xiàn)隱式等待,使用難度相對于顯式等待要簡單很多。

driver.implicitly_wait(5)

強制等待

使用 time.sleep() 強制等待,設置固定的休眠時間,等待元素加載,對于代碼的運行效率會有影響。

元素定位

Selenium提供了8種基本元素定位的方法,分別是id,name,class name,tag name,link text,partial link text,xpath,css selector,其中id,name,class name,tag name是根據(jù)元素的標簽或元素的屬性來進行定位;link text,partial link text是根據(jù)超鏈接的文本來進行定位;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') # 通過標簽名獲取元素

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選擇器獲取元素

元素操作

定位到元素獲取到元素對象之后,就可以對元素進行我們想要的操作了,Selenium提供了許多API供我們操作元素,常用的操作有點擊、輸入、清除、獲取元素坐標值、獲取元素寬高值、元素屬性值、檢查元素是否被選中。

elemnet.click() # 點擊元素

element.send_keys('武漢') ? # 輸入內(nèi)容

element.clear() # 清除內(nèi)容

element.location.get('x') # 獲取元素左上角X軸坐標

element.location.get('y') # 獲取元素左上角Y軸坐標

element.size.get('width') # 獲取元素寬度

element.size.get('height') # 獲取元素高度

element.is_selected() # 元素是否被選中

鼠標操作

常見的鼠標操作有:點擊、右擊、雙擊、懸停、拖拽等,對于這些鼠標操作Selenium都封裝了相應的操作方法?

在Selenium中將操作鼠標的方法封裝在ActionChains類中,在ActionChains類中所有提供的鼠標事件方法,在調(diào)用的時候所有的行為都存儲在ActionChains對象中,而perform()方法就是真正去執(zhí)行所有的鼠標事件。

from selenium.webdriver.common.action_chains import ActionChains # 導包

actionChains = ActionChains(driver) # 實例化ActionChains對象

actionChains.move_to_element(element).perform() # 鼠標懸停

actionChains.drag_and_drop(elementA, elementB).perform()? # 鼠標拖拽

actionChains.context_click(element).perform() # 鼠標右擊

actionChains.double_click(element).perform() # 鼠標雙擊

鍵盤操作

Selenium中把鍵盤的按鍵都封裝在Keys類中, 模擬鍵盤上一些按鍵或者組合鍵的輸入,使用send_Keys+Keys.XXX實現(xiàn)鍵盤上的組合按鍵如:Ctrl+C 、Ctrl+V。

from selenium.webdriver.common.keys import Keys # 導包

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同樣提供了相應的API用于針對瀏覽器的操作,常用的有最大化瀏覽器窗口,設置瀏覽器窗口大小,設置瀏覽器的位置,控制瀏覽器前進后退,頁面刷新。

driver.maximize_window()? # 瀏覽器窗口最大化

driver.set_window_size(800, 800)? # 瀏覽器窗口寬800 高800

driver.set_window_rect(300, 0)? # 瀏覽器位置(300,0)

driver.back()? # 瀏覽器后退

driver.forward()? # 瀏覽器前進

driver.refresh()? # 刷新頁面

其他操作

標簽頁

driver.get_screenshot_as_file('./baidu.png') # 頁面截圖

driver.close() # 關閉當前標簽頁

driver.quit() # 關閉所有標簽頁

在某個頁面點擊鏈接打開了一個新的標簽頁,此時selenium是無法定位到新標簽頁的元素。這就涉及到句柄的概念了,句柄就是標簽頁對象的唯一標識,每個標簽頁都有自己的句柄,可以通過句柄來實現(xiàn)標簽頁的切換,從而定位到對應標簽頁的元素。

handles = driver.window_handles? # 獲取所有標簽頁的句柄

driver.switch_to.window(handles[1])? # 切換到指定句柄標簽頁

啟動參數(shù)

Chrome Options是一個配置chrome啟動時屬性的類,通過這個參數(shù)我們可以為Chrome添加啟動參數(shù)

設置 chrome 二進制文件位置 (binary_location)

添加啟動參數(shù) (add_argument)

添加擴展應用 (add_extension, add_encoded_extension)

添加實驗性質(zhì)的設置參數(shù) (add_experimental_option)

設置調(diào)試器地址 (debugger_address)

Chrome Options常用的行為一般有以下幾種:

禁止圖片和視頻的加載:提升網(wǎng)頁加載速度。

添加代理:用于翻墻訪問某些頁面,或者應對IP訪問頻率限制的反爬技術。

使用移動頭:訪問移動端的站點,一般這種站點的反爬技術比較薄弱。

添加擴展:像正常使用瀏覽器一樣的功能。

設置編碼:應對中文站,防止亂碼。

阻止JavaScript執(zhí)行

在UI自動化中打開瀏覽器前可以加入對瀏覽器的選項配置,通過設置不同的參數(shù),可以修改瀏覽器的默認行為。

from selenium import webdriver

options = webdriver.ChromeOptions() # 實例化一個啟動參數(shù)對象

options.add_argument('--headless') # 設置瀏覽器瀏覽器不提供可視化頁面

options.add_argument('lang=zh_CN.UTF-8') # 設置編碼

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') # 最大化運行(全屏窗口),不設置,取元素會報錯

options.add_argument('--disable-infobars') # 禁用瀏覽器正在被自動化程序控制的提示

options.add_argument('--hide-scrollbars') # 隱藏滾動條, 應對一些特殊頁面

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

') # 設置UA請求頭

driver = webdriver.Chrome(chrome_options=options)

執(zhí)行JS腳本

有些情況下,selenium提供的API無法完成對應的操作或者操作比較麻煩,此時可以借助JS腳本來實現(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里再進行定位。

driver.switch_to.frame('alibaba-login-box') # 且換到指定frame

driver.switch_to.default_content()? # 切回默認頁面

隱藏指紋特征

使用slenium啟動的瀏覽器,大多數(shù)都會被網(wǎng)站通過一些指紋特征監(jiān)測到,識別到爬蟲行為,就會拒絕selenium的操作,如何避免這種情況,關鍵點在于如何在瀏覽器檢測之前將這些特征進行隱藏,事實上,前人已經(jīng)為我們鋪好了路,解決這個問題的關鍵,實際就是一個 stealth.min.js 文件,這個文件是給 puppeteer 用的,在 Python 中使用的話需要單獨執(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})

結語

本文只是簡單的介紹了selenium+python的安裝使用,以及一些基礎常用的API操作,還有很多高級操作、用法需要更深入的了解學習。實際運用的話可能還需要與其他框架、工具整合使用,這些都是需要經(jīng)過更深層次的理解與學習。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。