Python+Selenium實現自動化測試

🍅?點擊文末小卡片?,免費獲取軟件測試全套資料,資料在手,漲薪更快

安裝selenium

打開命令控制符輸入:pip install -U selenium

火狐瀏覽器安裝firebug:www.firebug.com,調試所有網站語言,調試功能

Selenium IDE 是嵌入到Firefox 瀏覽器中的一個插件,實現簡單的瀏覽器操 作的錄制與回放功能,IDE 錄制的腳本可以可以轉換成多種語言,從而幫助我們快速的開發腳本,下載地址:https://addons.mozilla.org/en-US/firefox/addon/selenium-ide/

如何使用IDE錄制腳本:點擊seleniumIDE——點擊錄制——開始錄制——錄制完成后點擊文件Export Test Case——python/unittest/Webdriver——保存;

安裝python

安裝的時候,推薦選擇“Add exe to path”,將會自動添加Python的程序到環境變量中。然后可以在命令行輸入 python -V 檢測安裝的Python版本。

瀏覽器內殼:IE、chrome、FireFox、Safari

1、webdriver:用unittest框架寫自動化用例(setUp:前置條件,tearDown清場) ?

1 import unittest2 from selenium import webdriver3 4 class Ranzhi(unittest.TestCase):5     def setUp(self):6        self.driver = webdriver.Firefox() #選擇火狐瀏覽器7     def test_ranzhi(self):8        pass9     def tearDown(self):
10        self.driver.quit()#退出瀏覽器

2、斷言,檢查跳轉的網頁是否和實際一致

斷言網址時需注意是否為偽靜態(PATH_INFO)或者GET,前者采用路徑傳參數(sys/user-creat.html),后者通過字符查詢傳參數(sys/index.php?m=user&f=index)

當采用不同方式校驗網址會發現變化。

1 self.assertEqual("http://localhost:8080/ranzhi/www/s/index.php?m=index&f=index",
2 ? ? ? ? ? ? ? ? ? ?self.driver.current_url, ?"登錄跳轉失敗")

3、定位元素,在html里面,元素具有各種各樣的屬性。我們可以通過這樣唯一區別其他元素的屬性來定位到這個元素

WebDriver提供了一系列的元素定位方法。常見的有以下幾種:id,name,link text,partial link text,xpath,css seletor,class,tag.

1 self.driver.find_element_by_xpath('//*[@id="s-menu-superadmin"]/button').click()
2 self.driver.find_element_by_id('account').send_keys('admin')
3 self.driver.find_element_by_link_text(u'退出').click()?

定位元素需注意的問題:

a.時間不夠,采用兩種方式(self.implicitly_wait(30),sleep(2))

b.函數嵌套(<iframe></iframe>)

1 # 進入嵌套
2 ? self.driver.switch_to.frame('iframe-superadmin')
3 #退出嵌套
4 ? self.driver.switch_to.default_content()

c.flash,驗證碼(關閉驗證碼或使用萬能碼)

d.xpath問題:最好采用最簡xpath,當xpath中出現li[10]等時需注意,有時頁面定位會出現問題

4、采用CSV存數據

CSV:以純文本形式存儲表格數據(數字和文本),CSV文件由任意數目的記錄組成,記錄間以某種換行符分隔;每條記錄由字段組成,字段間的分隔符是其它字符或字符串,最常見的是逗號或制表符。大量程序都支持某種CSV變體,至少是作為一種可選擇的輸入/輸出格式。

1 melody101,melody101,m,1,3,123456,@qq.com
2 melody102,melody101,f,2,5,123456,@qq.com
3 melody103,melody101,m,3,2,123456,@qq.com

 1 import csv2 # 讀取CSV文件到user_list字典類型變量中3 user_list = csv.reader(open("list_to_user.csv", "r"))4 # 遍歷整個user_list5 for user in user_list:6     sleep(2)7     self.logn_in('admin', 'admin')8     sleep(2)9     # 讀取一行csv,并分別賦值到user_to_add 中
10     user_to_add = {'account': user[0],
11                     'realname': user[1],
12                     'gender': user[2],
13                     'dept': user[3],
14                     'role': user[4],
15                      'password': user[5],
16                      'email': user[0] + user[6]}
17      self.add_user(user_to_add)

5、對下拉列表的定位采用select標簽

1 from selenium.webdriver.support.select import Select
2 # 選擇部門
3 dp =self.driver.find_element_by_id('dept')
4 Select(dp).select_by_index(user['dept'])
5 # 選擇角色
6 Select(self.driver.find_element_by_id('role')).select_by_index(user['role'])

6、模塊化代碼

需要對自動化重復編寫的腳本進行重構(refactor),將重復的腳本抽取出來,放到指定的代碼文件中,作為共用的功能模塊。使用模塊化代碼注意需倒入該代碼。

 1 #模塊化代碼后引用,需導入代碼模塊2 from ranzhi_lib import RanzhiLib3 self.lib = RanzhiLib(self.driver)4 # 點擊后臺管理5 self.lib.click_admin_app()6 sleep(2)7 # 點擊添加用戶8 self.lib.click_add_user()9 # 添加用戶
10 self.lib.add_user(user_to_add)
11 sleep(1)
12 # 退出
13 self.lib.logn_out()
14 sleep(2)
1 class RanzhiLib():
2 ? ? # 構造方法
3 ? ? def __init__(self, driver):
4 ? ? ? ? self.driver = driver

7、自定義函數運行的先后順序

完整的單元測試很少只執行一個測試用例,開發人員通常都需要編寫多個測試用例才能對某一軟件功能進行比較完整的測試,這些相關的測試用例稱為一個測試用例集,在PyUnit中是用TestSuite類來表示,采用unittest.TestSuite()。

PyUnit使用TestRunner類作為測試用例的基本執行環境,來驅動整個單元測試過程。Python開發人員在進行單元測試時一般不直接使用TestRunner類,而是使用其子類TextTestRunner來完成測試。

詳情請查看:http://www.ibm.com/developerworks/cn/linux/l-pyunit/

1 # 構造測試集
2 suite = unittest.TestSuite()
3 suite.addTest(RanzhiTest("test_login"))
4 suite.addTest(RanzhiTest("test_ranzhi"))
5     
6 # 執行測試
7 runner = unittest.TextTestRunner()
8 runner.run(suite)

以下代碼為登錄“然之系統”,進入添加用戶,循環添加用戶并檢測添加成功,再退出的過程。以下程序分別為主程序,模塊化程序,執行程序,CSV文件

 1 import csv2 import unittest3 from time import sleep4 5 from selenium import webdriver6 # 模塊化代碼后引用需導入代碼模塊7 from ranzhi_lib import RanzhiLib8 9 
10 class Ranzhi(unittest.TestCase):
11     def setUp(self):
12         self.driver = webdriver.Firefox()
13         self.lib = RanzhiLib(self.driver)
14 
15     # 主函數
16     def test_ranzhi(self):
17         # 讀取CSV文件到user_list字典類型變量中
18         user_list = csv.reader(open("list_to_user.csv", "r"))
19         # 遍歷整個user_list
20         for user in user_list:
21             sleep(2)
22             self.lib.logn_in('admin', 'admin')
23             sleep(2)
24             # 斷言
25             self.assertEqual("http://localhost:8080/ranzhi/www/sys/index.html",
26                              self.driver.current_url,
27                              '登錄跳轉失敗')
28             # 讀取一行csv,并分別賦值到user_to_add 中
29             user_to_add = {'account': user[0],
30                            'realname': user[1],
31                            'gender': user[2],
32                            'dept': user[3],
33                            'role': user[4],
34                            'password': user[5],
35                            'email': user[0] + user[6]}
36             # 點擊后臺管理
37             self.lib.click_admin_app()
38             # 進入嵌套
39             self.lib.driver.switch_to.frame('iframe-superadmin')
40             sleep(2)
41             # 點擊添加用戶
42             self.lib.click_add_user()
43             # 添加用戶
44             self.lib.add_user(user_to_add)
45             # 退出嵌套
46             self.driver.switch_to.default_content()
47             sleep(1)
48             # 退出
49             self.lib.logn_out()
50             sleep(2)
51             # 用新賬號登錄
52             self.lib.logn_in(user_to_add['account'], user_to_add['password'])
53             sleep(2)
54             self.lib.logn_out()
55             sleep(2)
56 
57     def tearDown(self):
58         self.driver.quit()
 1 from time import sleep2 3 from selenium.webdriver.support.select import Select4 5 6 class RanzhiLib():7     # 構造方法8     def __init__(self, driver):9         self.driver = driver
10 
11     # 模塊化添加用戶
12     def add_user(self, user):
13         driver = self.driver
14         # 添加用戶名
15         ac = driver.find_element_by_id('account')
16         ac.send_keys(user['account'])
17         # 真實姓名
18         rn = driver.find_element_by_id('realname')
19         rn.clear()
20         rn.send_keys(user['realname'])
21         # 選擇性別
22         if user['gender'] == 'm':
23             driver.find_element_by_id('gender2').click()
24         elif user['gender'] == 'f':
25             driver.find_element_by_id('gender1').click()
26         # 選擇部門
27         dp = driver.find_element_by_id('dept')
28         Select(dp).select_by_index(user['dept'])
29         # 選擇角色
30         role = driver.find_element_by_id('role')
31         Select(role).select_by_index(user['role'])
32         # 輸入密碼
33         pwd1 = driver.find_element_by_id('password1')
34         pwd1.clear()
35         pwd1.send_keys(user['password'])
36 
37         pwd2 = driver.find_element_by_id('password2')
38         pwd2.send_keys(user['password'])
39         # 輸入郵箱
40         em = driver.find_element_by_id('email')
41         em.send_keys(user['email'])
42         # 點擊保存
43         driver.find_element_by_id('submit').click()
44         sleep(2)
45 
46     # 登錄賬號
47     def logn_in(self, name, password):
48         driver = self.driver
49         driver.get('http://localhost:8080/ranzhi/www')
50         sleep(2)
51 
52         driver.find_element_by_id('account').clear()
53         driver.find_element_by_id('account').send_keys(name)
54         driver.find_element_by_id('password').clear()
55         driver.find_element_by_id('password').send_keys(password)
56         driver.find_element_by_id('submit').click()
57         sleep(2)
58 
59     # 退出賬號
60     def logn_out(self):
61         self.driver.find_element_by_id('start').click()
62         sleep(4)
63         self.driver.find_element_by_link_text(u'退出').click()
64         sleep(3)
65 
66     # 點擊后臺管理
67     def click_admin_app(self):
68         self.driver.find_element_by_xpath('//*[@id="s-menu-superadmin"]/button').click()
69         sleep(1)
70 
71     def click_add_user(self):
72         self.driver.find_element_by_xpath('//*[@id="shortcutBox"]/div/div[1]/div/a/h3').click()
73         sleep(3)
 1 import unittest2 3 from ranzhi import Ranzhi4 5 6 class RanzhiTestRunner():7     def run_tests(self):8         suite = unittest.TestSuite()9         suite.addTest(Ranzhi('test_ranzhi'))
10         runner = unittest.TextTestRunner()
11         runner.run(suite)
12 
13 
14 if __name__ == "__main__":
15     ranzhi_test_runner = RanzhiTestRunner()
16     ranzhi_test_runner.run_tests()

1 melody109,melody101,m,1,3,123456,@qq.com
2 melody106,melody101,f,2,5,123456,@qq.com
3 melody107,melody101,m,3,2,123456,@qq.com

最后感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:

這些資料,對于做【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!凡事要趁早,特別是技術行業,一定要提升技術功底。

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

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

相關文章

2024年CSP-X初賽真題及答案解析(6-10)

2024年CSP-X初賽真題及答案解析(6-10) 字符串abcabcabc有多少不同的非空子串?( )。 A. 24 B. 36 C. 45 D. 46 答案:A 解析: 長度 1: 3 個(a, b, c) 長度 2: 3 個(ab, bc, ca) 長度 3: 3 個(abc, bca, cab) 長度 4: 3 個(abca, bcab, cabc) 長度 5: 3 個(a…

緩存與數據庫一致性的4大坑及終極解決方案

緩存雪崩、擊穿、穿透全中招&#xff1f;別讓緩存與數據庫的“愛恨情仇”毀了你的系統&#xff01; 你有沒有經歷過這樣的深夜告警&#xff1a;Redis 響應延遲飆升&#xff0c;數據庫 CPU 直沖 100%&#xff0c;接口大面積超時&#xff1f;一查日志&#xff0c;發現大量請求繞過…

基于 Python charm 庫實現的一些 Pairing 密碼學算法

基于 Python charm 庫實現了一些 Pairing 密碼學算法&#xff0c;放在了 https://github.com/BatchClayderman/Cryptography-Schemes 里面。 在正確部署了 Python charm 庫后&#xff0c;所有的 Python 腳本都是獨立的&#xff0c;即該存儲庫中不存在一個腳本調用另一個腳本的…

用戶體驗五大要點:從問題到解決方案的完整指南

在互聯網產品設計和運營的過程中&#xff0c;用戶體驗&#xff08;User Experience&#xff0c;簡稱 UX&#xff09; 已經成為決定產品成敗的關鍵因素。一個功能再強大的產品&#xff0c;如果用戶用得不舒服、不信任&#xff0c;甚至覺得沒有價值&#xff0c;最終都會被拋棄。那…

MySQL 外鍵約束:表與表之間的 “契約”,數據一致性的守護者

MySQL 外鍵約束&#xff1a;表與表之間的 “契約”&#xff0c;數據一致性的守護者 在 MySQL 數據庫設計中&#xff0c;外鍵約束&#xff08;FOREIGN KEY&#xff09;是維護表之間關聯關系的核心工具。它就像表與表之間的一份 “契約”&#xff0c;確保從表&#xff08;如訂單…

《投資-54》元宇宙

元宇宙&#xff08;Metaverse&#xff09;是一個近年來備受關注的概念&#xff0c;它描繪了一個虛擬與現實交融、由多個互連的3D虛擬世界組成的沉浸式數字環境。用戶可以通過虛擬現實&#xff08;VR&#xff09;、增強現實&#xff08;AR&#xff09;、互聯網和其他技術&#x…

【數據結構】Java集合框架:List與ArrayList

文章目錄一、認識List接口1.1 List的定義與繼承關系1.2 Collection接口的核心方法1.3 List接口的獨特方法二、線性表與順序表基礎2.1 線性表2.2 順序表自定義順序表&#xff08;MyArrayList&#xff09;實現1. 前期準備&#xff1a;自定義異常類2. MyArrayList核心結構3. 工具方…

K8S里的“豌豆莢”:Pod

1. 為什么要有podPod 這個詞原意是“豌豆莢”&#xff0c;后來又延伸出“艙室”“太空艙”等含義&#xff0c;你可以看一下這張圖片&#xff0c;形 象地來說 Pod 就是包含了很多組件、成員的一種結構。之前的容器技術讓進程在一個“沙盒”環境里運行&#xff0c;具有良好的隔離…

vue3 基本教程-運行一個最小demo

Vue 3 基本教程 - 運行一個最小 Demo 1. 創建項目 使用 Vue 官方腳手架工具創建一個新項目&#xff1a; # 安裝 Vue CLI (如果尚未安裝) npm install -g vue/cli# 創建一個新項目 vue create vue3-demo# 選擇 Vue 3 預設 # 使用方向鍵選擇 "Default (Vue 3)" 然后按 …

大數據新視界 -- Hive 集群搭建與配置的最佳實踐(2 - 16 - 13)

??????親愛的朋友們,熱烈歡迎你們來到 青云交的博客!能與你們在此邂逅,我滿心歡喜,深感無比榮幸。在這個瞬息萬變的時代,我們每個人都在苦苦追尋一處能讓心靈安然棲息的港灣。而 我的博客,正是這樣一個溫暖美好的所在。在這里,你們不僅能夠收獲既富有趣味又極為實…

C/C++ 轉 Java 的數據結構初階對比指南

一、先遣了解和回顧1、預覽快速對比表格數據結構????C/C 實現????Java 實現????關鍵區別????數組??int arr[5];int[] arr new int[5];語法類似&#xff0c;Java 數組是對象??動態數組??vector<int> v;ArrayList<Integer> list new ArrayLi…

長連接和短連接

在網絡通信中&#xff0c;長連接&#xff08;Long Connection&#xff09;和短連接&#xff08;Short Connection&#xff09;是兩種核心的連接管理策略&#xff0c;其區別主要體現在連接生命周期、資源占用和適用場景上。以下是兩者的詳細解析&#xff1a;一、核心概念對比特性…

Java:使用spring-cloud-gateway的應用報DnsNameResolverTimeoutException原因和解決方法

使用spring-cloud-gateway時&#xff0c;有時會報DnsNameResolverTimeoutException異常。堆棧信息類似&#xff1a;Caused by: java.net.UnknownHostException: Failed to resolve cloudconnector.linkup-sage.comat io.netty.resolver.dns.DnsResolveContext.finishResolve(Dn…

SpringCloud概述

目錄 一、概念 1.1 微服務架構 1.2 SpringCloud概念 1.3 核心價值 1.4 能力邊界 1.5 微服務總體架構圖 二、生態圈 2.1 不同生態圈組件對比 2.2 組件介紹 2.2.1 服務發現與注冊 2.2.2 配置管理 2.2.3 API網關 2.2.4 容錯與熔斷 2.2.5 客戶端負載均衡 2.2.6 服務…

光伏電站環境監測儀—專為光伏電站設計的氣象監測設備

光伏電站環境監測儀是專為光伏電站設計的氣象監測設備&#xff0c;通過實時采集關鍵環境參數&#xff0c;為光伏系統的發電效率評估、運維決策和安全預警提供數據支撐。監測參數太陽輻射采用高精度總輻射表&#xff0c;測量水平面總輻射和傾斜面輻射&#xff0c;精度達 2% 以內…

Node.js ≥ 18 安裝教程

Windows 安裝 下載安裝包&#xff1a;訪問 Node.js官網&#xff0c;下載最新的 LTS 版本&#xff08;確保版本 ≥ 18&#xff09;運行安裝程序&#xff1a;雙擊下載的安裝文件&#xff0c;按照向導完成安裝驗證安裝&#xff1a;打開命令提示符或PowerShell&#xff0c;輸入以下…

電腦 hdmi 沒有聲音問題解決

問題現象&#xff1a;電腦耳機聲音正常輸出&#xff0c;使用hdmi連接電視后&#xff0c;沒有聲音輸出。&#xff08;正常會通過hdmi 在電視上播放視頻和聲音&#xff09;解決方案:出現該情況很可能原因是 顯卡的驅動不對。網上找了各種方法都沒有解決&#xff0c;最后系統升級后…

學習日記-XML-day55-9.14

1.xml基本介紹知識點核心內容重點XML定義可擴展標記語言&#xff0c;用于數據存儲和傳輸與HTML的區別&#xff08;HTML用于展示&#xff0c;XML用于結構化數據&#xff09;XML用途1. 配置文件&#xff08;Spring的beans.xml、Tomcat的server.xml&#xff09;;2. 數據交換&#…

【系統架構設計(27)】信息安全技術集成

文章目錄一、本文知識覆蓋范圍二、信息安全基礎要素詳解1、機密性保障技術2、完整性驗證技術3、可用性保障技術4、可控性管理技術5、可審查性追溯技術三、網絡安全威脅與防護策略1、非授權訪問防護2、拒絕服務攻擊防護3、惡意軟件傳播防護四、加密技術體系與應用1、對稱加密技術…

什么是 SaaS 安全?

什么是 SaaS 安全&#xff1f; SaaS 安全專注于保護云中的數據、應用程序和用戶身份。它旨在應對基于云的軟件所面臨的挑戰&#xff0c;以確保信息的安全性和可用性。SaaS 安全致力于降低未授權訪問、數據泄露等風險&#xff0c;同時增強 SaaS 應用程序的安全性。 SaaS 安全不僅…