HTMLTestRunner下載地址:http://tungwaiyip.info/software/HTMLTestRunner.html.該頁面下載的HTMLTestRunner默認支持python2.x的,python3.x的需要修改相關的內容。
修改方式:
1.可將python2.x的下載之后自行網上尋找內容方法
2.文章后面上傳了我修改后的HTMLTestRunner
注:本文使用谷歌瀏覽器61版本
主要介紹通過一些簡單的例子來實現unittest和HTMLTestRunner的運用。並轉換成測試報告。
准備步驟:下載HTMLTestRunner並放入python目錄的lib文件夾下(這是我的,可以參考。E:\Program Files\Python36\Lib)
case:
1.百度網頁輸入框內容輸入
2.移動鼠標將隱藏的元素顯示出來
3.163郵箱登陸登陸
例子一:百度網頁輸入框內容輸入
步驟:找到輸入框元素並輸入內容,然后點擊按鈕進行查詢
# -*- coding: utf-8 -*- """ @__author__ :70486 @file: test_login01.py @time: 2017/10/19 20:54 @項目名稱:DemoTest """ import unittest from time import sleep from selenium import webdriver """ unittest框架中,優先執行setUp函數,所以一般在此函數中做一些准備工作。比如打開瀏覽器、打開網頁、頁面大小、等待時間等 tearDown函數是最后執行的。 如果想自動執行函數,函數名前綴必須是test_ """ class Test1(unittest.TestCase): def setUp(self): #print "start!" #python2.7輸出語句的寫法 print("start!") #打開谷歌。 self.driver = webdriver.Chrome("E:\drivers\Drivers\chromedriver59-61.exe") #瀏覽器界面最大化 self.driver.maximize_window() #打開網址 self.driver.get("https://www.baidu.com") #設置網頁加載超時時間 self.driver.implicitly_wait(30) def tearDown(self): #print"end!" print("end!") #關閉瀏覽器 self.driver.close() def test_01(self): print("通過id來搜索!") #通過輸入框id來找到元素 self.driver.find_element_by_id("kw").send_keys("通過id來輸入") #“百度一下”按鈕的點擊.通過js rf = self.driver.find_element_by_id("su") self.driver.execute_script("arguments[0].click();",rf) #加延遲,方便查看 sleep(3) def test_02(self): print("通過cssSelector來搜索!") #通過輸入框cssSelector來找到元素 self.driver.find_element_by_css_selector(".s_ipt").send_keys("通過cssSelector來輸入") # “百度一下”按鈕的點擊,按鈕class名有空格我們可以用逗號來代替空格 self.driver.find_element_by_css_selector(".bg.s_btn").click() # 加延遲,方便查看 sleep(3) def test_03(self): print("通過name來搜索!") #通過輸入框name來找到元素 self.driver.find_element_by_name("wd").send_keys("通過name來輸入") # “百度一下”按鈕的點擊.通過父類層級關系來點擊 self.driver.find_element_by_css_selector(".bg.s_btn_wr>input").click() # 加延遲,方便查看 sleep(3) if __name__ == "__main__": unittest.main()
單獨運行這個代碼有一個問題就是,每執行一個test_都會調用setUp和teatDown.
如果使用#setUpClass() 與 tearDownClass()就從頭到尾只調用一次
例子二:移動鼠標將隱藏的元素顯示出來
步驟:
1.移動鼠標
2.移動鼠標到某個元素,讓隱藏元素顯示
3.點擊需要顯示的隱藏元素
# -*- coding: utf-8 -*- """ @__author__ :70486 @file: test_move01.py @time: 2017/10/19 21:35 @項目名稱:DemoTest """ import unittest from time import sleep from selenium import webdriver from selenium.webdriver import ActionChains """ 任何自動化編寫的前提就是:先手動執行一遍。 unittest框架中,優先執行setUp函數,所以一般在此函數中做一些准備工作。比如打開瀏覽器、打開網頁、頁面大小、等待時間等 tearDown函數是最后執行的。 如果想自動執行函數,函數名前綴必須是test_ """ class Demo_Move(unittest.TestCase): @classmethod def setUpClass(cls): #print "start!" #python2.7輸出語句的寫法 print("start!") #打開谷歌。 cls.driver = webdriver.Chrome("E:\drivers\Drivers\chromedriver59-61.exe") #瀏覽器界面最大化 cls.driver.maximize_window() #打開網址 cls.url = "https://www.baidu.com/" cls.driver.get(cls.url) #設置網頁加載超時時間 cls.driver.implicitly_wait(30) @classmethod def tearDownClass(cls): #print"end!" print("end!") #關閉瀏覽器 cls.driver.close() """ 移動鼠標到“設置”菜單,然后點擊搜索設置,並點擊保存設置 1.找到“設置元素” 2.定義ActionChains鼠標動作並執行 3.找到搜索設置並點擊 4.找到“保存設置”按鈕 5.通過js點擊“保存設置”按鈕 6.點擊系統提示框的確定按鈕 """ def test_01(cls): print("移動到設置菜單並開始點擊!") #1.找到“設置元素” ele_pf = cls.driver.find_element_by_css_selector("#u1 > a.pf") #2.定義ActionChains鼠標動作並執行 # perform是執行鏈中的所有動作ActionChains動作 # move_to_element是移動鼠標到ele_pf元素 #鏈條式執行 ActionChains(cls.driver).move_to_element(ele_pf).perform() sleep(3)#加延遲看效果 #3.找到搜索設置並點擊 ele_setpref = cls.driver.find_element_by_css_selector("a.setpref") ele_setpref.click() sleep(2) # 加延遲看效果 #4.找到“保存設置”按鈕 prefpanelgo = cls.driver.find_element_by_css_selector(".prefpanelgo") #5.通過js點擊“保存設置”按鈕 cls.driver.execute_script("arguments[0].click();",prefpanelgo) #加延遲,方便查看 sleep(3) #6.點擊系統提示框的確定按鈕 '''獲取alert對話框''' alert = cls.driver.switch_to_alert() alert.accept() # alert對話框屬於警告對話框,我們這里只能接受彈窗 sleep(1) print("移動查找執行完畢") """ 移動鼠標到“更多產品”菜單,然后點擊音樂,搜索自己喜歡的音樂 1.移動到“更多” 2.定義ActionChains鼠標動作並執行 3.找到音樂並點擊 4.獲取音樂頁面的網址。判斷是否進入成功:assert 表達式 [, 參數] 5.找到輸入並輸入“喜歡你” 6.通過js點擊“百度一下”按鈕進行搜索 7.判斷搜索之后網址是否正確 8.通過返回按鈕回到百度搜索頁面 """ def test_02(cls): print("移動鼠標到“更多產品”菜單並開始點擊!") #1.移動到“更多” ele_bri = cls.driver.find_element_by_css_selector(".bri") #2.定義ActionChains鼠標動作並執行 # perform是執行鏈中的所有動作ActionChains動作 # move_to_element是移動鼠標到ele_pf元素 # 分布式執行 action = ActionChains(cls.driver) #定義ActionChains對象 action.move_to_element(ele_bri) # 定義移動的動作 action.perform() #執行動作 sleep(2)#加延遲看效果 #3.找到音樂並點擊 ele_span = cls.driver.find_element_by_css_selector("span.bdbriimgitem_3") cls.driver.execute_script("arguments[0].click();", ele_span) sleep(2) # 加延遲看效果 #4.獲取音樂頁面的網址。判斷是否進入成功:assert 表達式 [, 參數] assert "http://music.baidu.com"==cls.driver.current_url,"進入音樂失敗" print("成功進入音樂頁面!") #5.找到輸入並輸入“喜歡你” str = "喜歡你" cls.driver.find_element_by_id("ww").send_keys(str) #6.通過js點擊“百度一下”按鈕進行搜索 s_btn = cls.driver.find_element_by_css_selector(".s_btn") s_btn.submit() sleep(5) #加延遲,方便查看 #7.判斷搜索之后網址是否正確 assert "http://music.baidu.com/search?key=" + str == cls.driver.current_url,"音樂搜索失敗" print("成功搜索音樂!") #加延遲,方便查看 sleep(2) #8.通過返回按鈕回到百度搜索頁面 while cls.driver.current_url!=cls.url: print("當前網址是:" + cls.driver.current_url + "需要再次返回") cls.driver.back() if cls.driver.current_url == "data:,": print("返回出錯,進入了初始頁面:" + cls.driver.current_url) break; sleep(1) if cls.driver.current_url != "data:,": print("返回成功:" + cls.driver.current_url) print("搜索demo執行完畢") if __name__ == "__main__": #創建類對象。 demo_move = Demo_Move() unittest.main(demo_move)
這里使用了 unittest的setUpclass和tearDownClass,所以test執行的過程中都是使用了同一個頁面。需要主要每個test中所在的頁面是否需要重置
ActionChains的執行原理,當你調用ActionChains的方法時,不會立即執行,而是會將所有的操作按順序存放在一個隊列里,當你調用perform()方法時,隊列中的時間會依次執行。
ActionChains方法列表
click(on_element=None) ——單擊鼠標左鍵
click_and_hold(on_element=None) ——點擊鼠標左鍵,不松開
context_click(on_element=None) ——點擊鼠標右鍵
double_click(on_element=None) ——雙擊鼠標左鍵
drag_and_drop(source, target) ——拖拽到某個元素然后松開
drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某個坐標然后松開
key_down(value, element=None) ——按下某個鍵盤上的鍵
key_up(value, element=None) ——松開某個鍵
move_by_offset(xoffset, yoffset) ——鼠標從當前位置移動到某個坐標
move_to_element(to_element) ——鼠標移動到某個元素
move_to_element_with_offset(to_element, xoffset, yoffset) ——移動到距某個元素(左上角坐標)多少距離的位置
perform() ——執行鏈中的所有動作
release(on_element=None) ——在某個元素位置松開鼠標左鍵
send_keys(*keys_to_send) ——發送某個鍵到當前焦點的元素
send_keys_to_element(element, *keys_to_send) ——發送某個鍵到指定元素
assert斷言的使用:前面放比較的參數,后面放失敗的提示信息
瀏覽器導航頁的返回、前進、刷新
driver.back()
driver.forward()
driver.refresh()
創建類對象的方法:demo_move = Demo_Move() : 參數名=類名
例子:163郵箱登陸
# -*- coding: utf-8 -*- """ @__author__ :70486 @file: test_login02.py @time: 2017/10/19 23:28 @項目名稱:DemoTest """ import unittest from time import sleep from selenium import webdriver """ unittest框架中,優先執行setUp函數,所以一般在此函數中做一些准備工作。比如打開瀏覽器、打開網頁、頁面大小、等待時間等 tearDown函數是最后執行的。 如果想自動執行函數,函數名前綴必須是test_ """ class Login_Demo(unittest.TestCase): @classmethod def setUp(self): #print "start!" #python2.7輸出語句的寫法 print("start!") #打開谷歌。 self.driver = webdriver.Chrome("E:\drivers\Drivers\chromedriver59-61.exe") #瀏覽器界面最大化 self.driver.maximize_window() #打開網址 self.driver.get("http://mail.163.com/") #設置網頁加載超時時間 self.driver.implicitly_wait(30) @classmethod def tearDown(self): #print"end!" print("end!") #關閉瀏覽器 self.driver.close() """ 點擊登錄按鈕進入輸入賬號密碼 """ def test_01(self): print("登陸開始!") #1.進入frame ele_iframe = self.driver.find_element_by_css_selector("#x-URS-iframe") self.driver.switch_to.frame(ele_iframe) #2.找到賬號密碼輸入框並輸入內容 ele_user = self.driver.find_element_by_css_selector(".j-inputtext.dlemail") ele_password = self.driver.find_element_by_css_selector(".j-inputtext.dlpwd") ele_user.send_keys("userNema") ele_password.send_keys("password") sleep(2) #3.點擊登陸 self.driver.find_element_by_css_selector("#dologin").click() #4.釋放iframe,如果不釋放就無法對iframe之后的元素進行操作 self.driver.switch_to.default_content() #5.點擊退出,退出登陸 self.driver.find_element_by_css_selector("li#_mail_component_41_41>a").click() if __name__ == "__main__": unittest.main()
如果有iframe要先進入在進行元素操作不然會出現找不到元素的錯誤,元素操作完成之后要退出操作
進入iframe:先找到元素,然后通過switch_to.frame進入
ele_iframe = self.driver.find_element_by_css_selector("#x-URS-iframe")
driver.switch_to.frame(ele_iframe)
釋放iframe:
driver.switch_to.default_content()
HTMLTestRunner 的 運行
# coding:utf-8 import unittest import os import HTMLTestRunner #os.getcwd() 是獲取當前項目的目錄 # 用例路徑 case_path = os.path.join(os.getcwd(), "case") # 報告存放路徑 report_path = os.path.join(os.getcwd(), "report") # html報告文件 report_abspath = os.path.join(report_path, "result.html") #pattern是定義,前綴為test的py文件 discover = unittest.defaultTestLoader.discover(case_path, pattern="test*.py", top_level_dir=None) fp = open(report_abspath, "wb") runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u'自動化測試報告,測試結果如下:', description=u'用例執行情況:') # 調用add_case函數返回值 runner.run(discover) fp.close()
右鍵就可以執行這個py文件了,然后把我們前面三個編寫的文件一起執行。並且生成一個html文件
進入html的項目目錄用瀏覽器打開就可以看到執行后的報告了
整個程序運行下來,工具運行日志也可以看出運行結果
在unittest中:
成功是 .,失敗是 F,出錯是 E,跳過是 S。
在全部class中一共執行了6個test。
注:
本人新手,如有寫的不好希望可以留言修改請勿直接噴。。
至於我的谷歌啟動方式:driver = webdriver.Chrome("E:\drivers\Drivers\chromedriver59-61.exe")
是因為chromedriver.exe驅動文件並沒有配置到path中,。如果你已經配置了可以直接driver = webdriver.Chrome()啟動
例子下載地址:
鏈接: https://pan.baidu.com/s/1pLzDT5D
密碼: 56he
HTMLTestRunner下載地址
鏈接: https://pan.baidu.com/s/1bpljoTp
密碼: t2zr