selenium3.4.3 + python3.6 + HTMLTestRunner0.8.0


 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM