selenium+unittest實(shí)現(xiàn)web自動(dòng)化的示例代碼
前面我們學(xué)習(xí)unittest 的目的是用它編寫 Web 自動(dòng)化測試用例,所以接下來會(huì)將 unittest 與Selenium 結(jié)合起來寫一個(gè) Web 自動(dòng)化測試的例子。
我們?nèi)砸园俣人阉鳛槔?,?chuàng)建 test_baidu.py 文件
# _*_ coding:utf-8 _*_ """ name:zhangxingzai date:2023/2/25 """ import unittest from time import sleep from selenium import webdriver from selenium.webdriver.common.by import By class TestBaidu(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() self.baidu_url = 'https://www.baidu.com' def test_search_key_unittest(self): self.driver.get(self.baidu_url) self.driver.find_element(By.ID, 'kw').send_keys('unittest') self.driver.find_element(By.ID, 'su').click() sleep(2) title = self.driver.title self.assertEqual(title, 'unittest_百度搜索') def test_search_key_selenium(self): self.driver.get(self.baidu_url) self.driver.find_element(By.ID, 'kw').send_keys('selenium') self.driver.find_element(By.ID, 'su').click() sleep(2) title = self.driver.title self.assertEqual(title, 'selenium_百度搜索') def tearDown(self): self.driver.close() if __name__ == '__main__': unittest.main
對(duì)上面的代碼不做過多介紹,都是以 unittest 創(chuàng)建測試類和方法的。方法中的代碼是Selenium 腳本。不過,這里的代碼存在一些問題,我們來一一改進(jìn)。
首先,觀察代碼可以發(fā)現(xiàn),兩個(gè)測試用例中的步驟是一樣的,唯一的區(qū)別是搜索的關(guān)鍵字和斷言的結(jié)果不同。在學(xué)習(xí)過python模塊化,所以這里把操作步驟封裝成一個(gè)方法。
代碼如下:
# _*_ coding:utf-8 _*_ """ name:zhangxingzai date:2023/2/25 """ import unittest from time import sleep from selenium import webdriver from selenium.webdriver.common.by import By class TestBaidu(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() self.baidu_url = 'https://www.baidu.com' # 將百度首頁的訪問和搜索過程封裝成一個(gè)baidu_search()方法 def baidu_search(self, search_key): self.driver.get(self.baidu_url) self.driver.find_element(By.ID, 'kw').send_keys(search_key) self.driver.find_element(By.ID, 'su').click() sleep(2) def test_search_key_unittest(self): search_key = 'unittest' self.baidu_search(search_key) self.assertEqual(self.driver.title, search_key + '百度搜索') def test_search_key_selenium(self): search_key = "selenium" self.baidu_search(search_key) self.assertEqual(self.driver.title, search_key + "百度搜索") def tearDown(self): self.driver.close() if __name__ == '__main__': unittest.main
這里將百度首頁的訪問和搜索過程封裝成一個(gè) baidu_search()方法,并定義 search_key參數(shù)為搜索關(guān)鍵字,根據(jù)接收的關(guān)鍵字執(zhí)行不同內(nèi)容的搜索。這里的 baidu_search()方法不會(huì)被當(dāng)作測試用例執(zhí)行,因?yàn)楦鶕?jù) unittest 查找和執(zhí)行測試用例的規(guī)則,它只會(huì)把以“test”開頭的方法當(dāng)作測試用例。
另一個(gè)值得討論的問題是,測試用例的斷言要不要寫在封裝的方法中?從前面的代碼可以看出,測試的斷言點(diǎn)是一樣的。這里更傾向于把斷言寫在每一條測試用例里面。因?yàn)楹芏鄷r(shí)候就算操作步驟是一樣的,斷言點(diǎn)也不完全一樣。從設(shè)計(jì)的角度來看,斷言寫在每一個(gè)測試用例中也會(huì)更加清晰。
另外我們還發(fā)現(xiàn)每一條測試用例都要啟動(dòng)和關(guān)閉一次瀏覽器,這是非常耗時(shí)的,那么如何減少瀏覽器的啟動(dòng)和關(guān)閉次數(shù)呢?利用前面學(xué)過的setUpClass/tearDownClass可以解決這個(gè)問題。
# _*_ coding:utf-8 _*_ """ name:zhangxingzai date:2023/2/25 """ import unittest from time import sleep from selenium import webdriver from selenium.webdriver.common.by import By class TestBaidu(unittest.TestCase): @classmethod def setUpClass(cls): cls.driver = webdriver.Firefox() cls.baidu_url = 'https://www.baidu.com' def baidu_search(self, search_key): self.driver.get(self.baidu_url) self.driver.find_element(By.ID, 'kw').send_keys(search_key) self.driver.find_element(By.ID, 'su').click() sleep(2) def test_search_key_unittest(self): search_key = 'unittest' self.baidu_search(search_key) self.assertEqual(self.driver.title, search_key + '_百度搜索') def test_search_key_selenium(self): search_key = 'selenium' self.baidu_search(search_key) self.assertEqual(self.driver.title, search_key + '_百度搜索') @classmethod def tearDownClass(cls): cls.driver.close() if __name__ == '__main__': unittest.main
修改前:
修改后:
可以看到修改后省去16秒之多,這里雖然我們將 driver 驅(qū)動(dòng)定義為 cls.driver,但是在每個(gè)測試用例中使用時(shí)依然為self.driver。
當(dāng)整個(gè)測試類中的所有測試用例都運(yùn)行完成后,會(huì)調(diào)用 cls.driver.quit()關(guān)閉瀏覽器。
當(dāng)一個(gè)測試類中有多條測試用例時(shí),這種方式將會(huì)大大縮短測試用例的執(zhí)行時(shí)間。
這樣我們就得到了一個(gè)簡單的百度搜索的自動(dòng)化測試腳本,讀者可以根據(jù)此例試試別的場景。
到此這篇關(guān)于selenium+unittest實(shí)現(xiàn)web自動(dòng)化的示例代碼的文章就介紹到這了,更多相關(guān)selenium unittest web自動(dòng)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- selenium+python自動(dòng)化測試之使用webdriver操作瀏覽器的方法
- python基于Selenium的web自動(dòng)化框架
- Python結(jié)合Selenium簡單實(shí)現(xiàn)Web自動(dòng)化測試
- docker利用selenium+testng實(shí)現(xiàn)web自動(dòng)化的方法
- python+selenium的web自動(dòng)化上傳操作的實(shí)現(xiàn)
- 關(guān)于Python?Selenium自動(dòng)化導(dǎo)出新版WOS(web?of?science)檢索結(jié)果的問題
- Web自動(dòng)化之Selenium常用操作方法大全
相關(guān)文章

python 函數(shù)嵌套及多函數(shù)共同運(yùn)行知識(shí)點(diǎn)講解

python遞歸打印某個(gè)目錄的內(nèi)容(實(shí)例講解)

Python+Pygame實(shí)戰(zhàn)之炫舞小游戲的實(shí)現(xiàn)

pandas分組聚合(agg,transform,apply)

Python實(shí)現(xiàn)讀取txt文件并畫三維圖簡單代碼示例