示例代码web
baidu.py
浏览器
# _*_ coding:utf-8 _*_ import csv,unittest #导入csv模块 from time import sleep from selenium import webdriver from module import baidumodule class baidu(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() self.driver.maximize_window()#最大化窗口 self.driver.implicitly_wait(10)#隐式等待 self.search = baidumodule(self.driver) #将driver传给aidumodule这个类 with open("file.csv","r") as name: self.lines = name.readlines()#以行读取整个文件 def tearDown(self): self.driver.quit() def test_search(self): search = self.search lines = self.lines driver = self.driver search.login(lines[0]) sleep(1) title = driver.title self.assertEqual(title,'selenium_百度搜索2') sleep(2) def test_search1(self): search = self.search lines = self.lines driver = self.driver search.login(lines[1]) sleep(1) title = driver.title self.assertEqual(title,'selenium2_百度搜索') sleep(2) def test_search2(self): search = self.search lines = self.lines driver = self.driver search.login(lines[2]) sleep(1) title = driver.title self.assertEqual(title,'selenium3_百度搜索') sleep(2) def test_search3(self): search = self.search lines = self.lines driver = self.driver search.login(lines[3]) sleep(1) title = driver.title self.assertEqual(title,'webdriver_百度搜索') sleep(2) if __name__ == "__main__": #若是直接执行将执行如下代码,调用不执行如下代码 unittest.main()
module.py
svg
class baidumodule(): def __init__(self,driver,): self.dr = driver #不能在类中再次导入webdriver 两边的driver等于两个窗口,直接让调用方传入driver便可 def login(self,values): login_dr = self.dr login_dr.get("https://www.baidu.com/") login_dr.find_element_by_xpath("//*[@id='kw']").send_keys(values) login_dr.find_element_by_xpath("//*[@id='su']").click()
baidu.py执行结果测试
.... ---------------------------------------------------------------------- Ran 4 tests in 49.660s #运行4条耗时49.660s OK
以上代码都可成功执行可是执行过程当中每一个测试用例都须要再次打开浏览器,这会大大拖延执行时间,咱们可使用@classmethod
装饰器将@classmethod所装饰的方法改成类方法即setUpClass
和 tearDownClass
让每类执行只须要开启一次浏览器便可(在unittest中默认如此).ui
@classmethod def setUpClass(cls): "Hook method for setting up class fixture before running tests in the class." @classmethod def tearDownClass(cls): "Hook method for deconstructing the class fixture after running all tests in the class."
更改后的baidu.py
code
# _*_ coding:utf-8 _*_ import csv,unittest #导入csv模块 from time import sleep from selenium import webdriver from module import baidumodule class baidu(unittest.TestCase): @classmethod def setUpClass(cls):#类中最早执行 cls.driver = webdriver.Chrome() cls.driver.maximize_window() # 最大化窗口 cls.driver.implicitly_wait(10) # 隐式等待 cls.search = baidumodule(cls.driver) # 将driver传给aidumodule这个类 with open("file.csv","r") as name: cls.lines = name.readlines()#以行读取整个文件 @classmethod def tearDownClass(cls): #类中最后执行 cls.driver.quit() def test_search(self): search = self.search lines = self.lines driver = self.driver search.login(lines[0]) sleep(1) title = driver.title self.assertEqual(title,'selenium_百度搜索') sleep(2) def test_search1(self): search = self.search lines = self.lines driver = self.driver search.login(lines[1]) sleep(1) title = driver.title self.assertEqual(title,'selenium2_百度搜索') sleep(2) def test_search2(self): search = self.search lines = self.lines driver = self.driver search.login(lines[2]) sleep(1) title = driver.title self.assertEqual(title,'selenium3_百度搜索') sleep(2) def test_search3(self): search = self.search lines = self.lines driver = self.driver search.login(lines[3]) sleep(1) title = driver.title self.assertEqual(title,'webdriver_百度搜索') sleep(2) if __name__ == "__main__": #若是直接执行将执行如下代码,调用不执行如下代码 unittest.main()
执行结果:xml
.... ---------------------------------------------------------------------- Ran 4 tests in 23.124s#执行4条耗时23.124s OK
能够看到每次打开浏览器再执行至少多一倍的时间。blog
使用@classmethod装饰器时不要把要测试的网页放置到setUpClass中那样执行完第一个用例时不会再次打开浏览器,致使参数化等第二条用例只会在原地执行,因此要把连接放置到测试用例中。
以下是错误示例:utf-8
@classmethod def setUpClass(cls): cls.dr = webdriver.Chrome() cls.dr.maximize_window() cls.dr.implicitly_wait(10) cls.dr.get("https://www.baidu.com/")
正确写法:ci
def test_search(self,search_str,aa): # 接收上面的两个参数 '''百度测试用例''' self.dr.get("https://www.baidu.com/")#这样执行下个用例才会再次打开连接 self.dr.find_element_by_id("kw").send_keys(search_str) self.dr.find_element_by_id("su").click() sleep(2)