今天給大家推薦一款基于Python的網頁自動化工具:DrissionPage。這款工具既能控制瀏覽器,也能收發數據包,甚至能把兩者合而為一,簡單來說:集合了WEB瀏覽器自動化的便利性和 requests 的高效率優點。
一、DrissionPage框架產生背景
對網頁實現自動化,通常會有兩類形式:
直接向服務器發送請求數據包,獲取需要的數據,模擬數據流向操作。
控制瀏覽器跟網頁進行交互,模擬用戶界面操作。
前者輕量級,速度快,例如requests 庫。但requests面對需要登錄的網站時,往往還要應付驗證碼、JS 混淆、簽名參數等反爬手段,門檻較高。若數據是由 JS 計算生成的,還須重現計算過程,開發效率不高。
而后者直接使用瀏覽器,模擬用戶行為,如Selenium庫,可以很大程度上繞過這些坑,但瀏覽器運行效率不高。
因此,DrissionPag設計初衷,是將它們合而為一,能夠在不同須要時切換相應模式,并提供一種人性化的使用方法,提高開發和運行效率。
為什么叫DrissionPag
Selenium框架用于操作瀏覽器的對象叫 Driver,requests 用于管理請求連接的對象叫 Session,因此Drission 就是它們兩者的合體。在舊版本中,是通過對 selenium 和 requests 的重新封裝實現的。
但從 3.0 版開始,作者另起爐灶,用 chromium 協議自行實現了 selenium 全部功能,從而擺脫了對 selenium 的依賴,功能更多更強,運行效率更高,開發更靈活。
二、DrissionPage框架亮點特色
本庫采用全自研的內核,對比 selenium,有以下優點:
- 無 webdriver 特征,不會被網站識別,無需為不同版本的瀏覽器下載不同的驅動 。
- 運行速度更快,可以跨 iframe 查找元素,無需切入切出,iframe 看作普通元素,獲取后可直接在其中查找元素,邏輯更清晰。
- 可以同時操作瀏覽器中的多個標簽頁,即使標簽頁為非激活狀態,無需切換。
- 內置等待和自動重試功能。使不穩定的網絡變得易于控制,程序更穩定,編寫更省心。
- 允許反復使用已經打開的瀏覽器。無須每次運行從頭啟動瀏覽器,調試超方便。
- 極簡的語法規則。集成大量常用功能,定位元素更加容易,功能更強大穩定。
- 使用 POM 模式封裝,可直接用于測試,便于擴展。
- 等等。。。
三、安裝搭建
說了這么多,相信很多人已經躍躍欲試了,怎么快速搭建這套框架,先要準備一些基礎環境。
環境準備
- 操作系統:Windows、Linux 或 Mac。
- Python 版本:3.6 及以上
- 支持瀏覽器:Chromium 內核(如 Chrome 和 Edge)
項目地址:
https://gitee.com/g1879/DrissionPage
使用 pip 安裝 DrissionPage:
pip install DrissionPage
另外在開始之前,我們先進行一些簡單設置。如果只使用收發數據包功能,無須任何準備工作。
如果要控制瀏覽器,須設置瀏覽器路徑。程序默認設置控制 Chrome,所以以下用 Chrome 作為演示。如果要使用 Edge 或其它 Chromium 內核瀏覽器,設置方法是一樣的。
設置瀏覽器路徑:
from DrissionPage.easy_set import set_paths
set_paths(browser_path=r'這里修改為您的Chrome瀏覽器exe文件路徑')
這段代碼會記錄 Chrome 瀏覽器路徑到配置文件。由于路徑設置只要運行一次即可,不要寫到正式程序里。一般建議新建一個臨時 py 文件,并輸入以下代碼,填入您電腦里的 Chrome 瀏覽器 exe 文件路徑,然后執行。
四、實戰一下
1、嘗試啟動瀏覽器:
from DrissionPage import ChromiumPagepage = ChromiumPage()
page.get('https://www.baidu.com')
執行以下代碼,如果正常啟動了瀏覽器并且訪問了百度,說明可直接使用,跳過后面的步驟即可。
執行代碼前,如果已有打開的 Chrome 瀏覽器,請關閉。
2、與selenium框架代碼對比
#案例一:用顯性等待方式查找第一個文本包含 some text 的元素。
# 使用 selenium:
element = WebDriverWait(driver).until(ec.presence_of_element_located((By.XPATH, '//*[contains(text(), "some text")]')))# 使用 DrissionPage:
element = page('some text')#案例二:跳轉到第一個標簽頁
# 使用 selenium:
driver.switch_to.window(driver.window_handles[0])# 使用 DrissionPage:
page.to_tab(0)# 案例三:拖拽一個元素
# 使用 selenium:
ActionChains(driver).drag_and_drop(ele1, ele2).perform()# 使用 DrissionPage:
ele1.drag_to(ele2)
以上代碼實現一模一樣的功能,但DrissionPage代碼明顯更簡潔優雅。
3、與requests框架代碼對比
# 案例一:獲取元素內容
url = 'https://baike.baidu.com/item/python'# 使用 requests:
from lxml import etree
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'}
response = requests.get(url, headers = headers)
html = etree.HTML(response.text)
element = html.xpath('//h1')[0]
title = element.text# 使用 DrissionPage:
page = WebPage('s')
page.get(url)
title = page('tag:h1').text
4、DrissionPage不同模式切換
例如:用瀏覽器登錄網站,然后切換到 requests 讀取網頁。兩者會共享登錄信息。
from DrissionPage import WebPage
from time import sleep# 創建頁面對象,默認 d 模式
page = WebPage()
# 訪問個人中心頁面(未登錄,重定向到登錄頁面)
page.get('https://gitee.com/profile') # 使用 selenium 輸入賬號密碼登錄
page.ele('@id:user_login').input('your_user_name')
page.ele('@id:user_password').input('your_password\n')
sleep(1)# 切換到 s 模式
page.change_mode()
# 登錄后 session 模式的輸出
print('登錄后title:', page.title, '\n')
五、小結
DrissionPage體驗一番后,雖然還是存在一些不足的地方,但整得來講,很多設計理念還是非常值得借鑒的,更多功能就留給大家去探索了,項目文檔地址:
http://g1879.gitee.io/drissionpagedocs/
最后感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,這些資料,對于【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:
這些資料,對于【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴上萬個測試工程師們走過最艱難的路程,希望也能幫助到你!?