推薦一款新的自動化測試框架:DrissionPage

今天給大家推薦一款基于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/

最后感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,這些資料,對于【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:

這些資料,對于【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴上萬個測試工程師們走過最艱難的路程,希望也能幫助到你!?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/719050.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/719050.shtml
英文地址,請注明出處:http://en.pswp.cn/news/719050.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C++庖丁解牛】默認成員函數

📙 作者簡介 :RO-BERRY 📗 學習方向:致力于C、C、數據結構、TCP/IP、數據庫等等一系列知識 📒 日后方向 : 偏向于CPP開發以及大數據方向,歡迎各位關注,謝謝各位的支持 目錄 前言1. 構造函數1.1 …

android系統簽名

系統簽名是指由 Android 系統或設備制造商使用他們的私鑰對應用程序進行數字簽名的過程。在 Android 應用程序開發中,應用程序的 APK 文件需要使用開發者的私鑰進行簽名,以便在安裝和更新時驗證應用程序的真實性和完整性。 系統簽名是一種特殊的簽名&am…

職場高薪 |「中高級測試」面試題

【軟件測試面試突擊班】2024吃透軟件測試面試最全八股文攻略教程,一周學完讓你面試通過率提高90%!(自動化測試) 一.基礎題 1.測試用例你一般是怎么設計的,怎么可以提高覆蓋率? 有沒有形成自己的 一套方法論…

【個人感悟】醫院所見思考怎么做AI+醫療

今天陪家里人去醫院折騰了一上午,從消化科檢查(驗血、胸部CT、心電圖), 消化科醫生看完報告,說CT影像看肺部有些問題,又排隊掛號呼吸科折騰, 一上午來回就過去了。 整個過程看似系統信息化程度…

Docker運行時安全之道: 保障容器環境的安全性

引言 Docker作為容器化技術的領軍者,為應用部署提供了靈活性和便捷性。然而,在享受這些優勢的同時,必須重視Docker運行時的安全性。本文將深入研究一些關鍵的Docker運行時安全策略,以確保你的容器環境在生產中得到有效的保護。 1. 使用最小特權原則 保持容器以最小權限運…

Jmeter接口測試---隨機數、加密、cookie鑒權、斷言、CSV參數化

隨機數 第一步:選擇工具-函數助手對話框 第二步:選擇random,設置最大值最小值,復制函數字符串到指定位置 加密接口 類型:AES、DES、Base64、RSA(可以解密) | MD5、SHA、HmacSHA(不…

llama.c代碼2

1、forward 1.1、復習 encode(tokenizer, prompt, 1, 0, prompt_tokens, &num_prompt_tokens); 在encode函數結尾處(gdb) p *n_tokens $3 2(gdb) p *tokens3 $6 {1, 22172, 417} 在encode調用后 (gdb) print num_prompt_tokens $11 2 (gdb) print *prompt_tokens3 $13 …

【Nginx基礎和原理介紹】講解

Nginx基礎和原理介紹 1. 前言2. 基本特性3. 工作原理4. 總結 1. 前言 Nginx(發音為“engine-x”)是一個高性能的HTTP和反向代理服務器,它還可以作為IMAP/POP3代理服務器使用,Nginx是由Igor Sysoev為俄羅斯訪問量第二的Rambler.ru…

JavaScript 中的類型轉換機制(詳細講解)

文章目錄 一、概述二、顯示轉換Number()parseInt()String()Boolean() 三、隱式轉換自動轉換為布爾值自動轉換成字符串自動轉換成數值 一、概述 前面我們講到,JS中有六種簡單數據類型:undefined、null、boolean、string、number、symbol,以及…

(sub)三次握手四次揮手

TCP的三次握手與四次揮手理解及面試題 序列號seq:占4個字節,用來標記數據段的順序,TCP把連接中發送的所有數據字節都編上一個序號,第一個字節的編號由本地隨機產生;給字節編上序號后,就給每一個報文段指派一…

(學習日記)2024.03.03:UCOSIII第五節:常用匯編指令+OS初始化+啟動任務+任務切換

寫在前面: 由于時間的不足與學習的碎片化,寫博客變得有些奢侈。 但是對于記錄學習(忘了以后能快速復習)的渴望一天天變得強烈。 既然如此 不如以天為單位,以時間為順序,僅僅將博客當做一個知識學習的目錄&a…

雙重檢驗鎖

雙重檢驗鎖:設計模式中的單例模式,細分為單例模式中的懶加載模式。 單例模式 單例模式:指的是一個類只有一個對象。最簡單的實現方式是設一個枚舉類,只有一個對象。缺點是當對象還沒有被使用時,對象就已經創建存在了…

Backend - 日志記錄

目錄 1. settings.py 文件設定 2. book_log.py 文件設定 3. view 視圖文件調用 1. settings.py 文件設定 文件位置:BookProject 目錄下 LOG_PATH os.path.join(os.getcwd(), logs) # 設定日志文件位置:項目名下的logs文件夾中 2. book_log.py 文…

C++ 創建并初始化對象

創建并初始化C對象 當我們創建一個C對象時,它需要占用一些內存,即使我們寫一個完全為空的類,類中沒有成員,什么也沒有,它至少也要占用一個字節的內存。但是我們類中有很多成員,它們需要存儲在某地方&#…

【擴散模型】生成模型中的Residual Self-Attention UNet 以及 DDPM的pytorch代碼

參考: [1] https://github.com/xiaohu2015/nngen/blob/main/models/diffusion_models/ddpm_cifar10.ipynb [2] https://www.bilibili.com/video/BV1we4y1H7gG/?spm_id_from333.337.search-card.all.click&vd_source9e9b4b6471a6e98c3e756ce7f41eb134 TOC 1 UNe…

視黃酸誘導基因-1敲除誘導樹突狀細胞的不成熟特性并延長異體移植小鼠的存活時間研究【AbMole】

器官移植是一種用于替換因疾病、損傷或其他原因受損的人體器官的醫療程序。盡管器官移植可以挽救生命并顯著提高生活質量,但存在供體器官短缺、排斥反應、器官功能障礙、感染和藥物副作用等問題。為了提高移植成功率和受體健康,需要有效的免疫策略。樹突…

如何使用支付寶沙箱環境本地配置模擬支付并實現公網遠程訪問【內網穿透】

文章目錄 前言1. 下載當面付demo2. 修改配置文件3. 打包成web服務4. 局域網測試5. 內網穿透6. 測試公網訪問7. 配置二級子域名8. 測試使用固定二級子域名訪問 前言 在沙箱環境調試支付SDK的時候,往往沙箱環境部署在本地,局限性大,在沙箱環境…

原理篇-- 定時任務xxl-job-服務端(admin)項目啟動過程--JobFailMonitorHelper初始化 (5)

文章目錄 前言一、JobFailMonitorHelper作用:二、JobFailMonitorHelper源碼內容:2.1 start() 初始化2.1.1 任務失敗重試:2.1.2 任務失敗告警信息發送:2.1.2.1 JobAlarmer 告警類:2.1.2.2 alarm 告警信息發送: 2.2 toStop() 終止線…

數據可視化原理-騰訊-3D網格熱力圖

在做數據分析類的產品功能設計時,經常用到可視化方式,挖掘數據價值,表達數據的內在規律與特征展示給客戶。 可是作為一個產品經理,(1)如果不能夠掌握各類可視化圖形的含義,就不知道哪類數據該用…

壁爐火焰溫和而寧靜,警惕火焰兇猛的潛在危害

在寒冷的冬夜,壁爐散發的溫暖和閃爍的火焰成為家庭的心靈港灣。然而,我們在享受壁爐帶來的溫馨時,有時候也要關注火焰的兇猛度,因為它可能引發一系列潛在危害。 首先,壁爐的火焰過于兇猛可能導致空氣質量下降。當火焰過…