目錄
1.編寫測試用例 web_cases.xlsx
2.框架搭建
3.自動化用例實現
4.用例篩選
一、流程
首先,在實戰之前,回顧好selenium的基礎知識。77節
只要是沒有現成封裝的方法可以使用,都可以通過發送JS代碼的方式進行操作。
1.編寫測試用例 web_cases.xlsx
2.框架搭建
須知:在接口自動化測試中,已經有現成的框架,可以直接拿來用。
①common 通用模塊,不以項目為轉移的
可以直接將common目錄直接拷貝到web自動化框架中來,(可以用,不代表一定要用,比如其中,MySQL_hanlder、request_handler不需要,web自動化中,不需要這2方面的操作,需要用的時候,可以直接復制過來用)
②config 配置文件
可以直接拷貝模塊,但是內容需要根據項目情況進行修改(比如,路徑、logger不需要修改, 修改賬號)
③data、libs、logs、middware、reports、testcases、run.py同理
框架的搭建,基本上跟接口的框架類似
3.自動化用例實現(web自動化測試中,登錄成功、登錄錯誤的步驟是不一樣的,要分開寫)
編寫測試用例腳本,根據web_testcases.xlsx文件進行編寫。
舉例:登錄失敗用例
步驟如下:
1.打開瀏覽器
2.訪問登錄頁面
3.元素定位+元素操作,輸入用戶名和密碼,點擊登錄
4.通過獲取頁面內容得到實際結果,進行斷言
根據上述步驟,編寫web自動化測試腳本(需要登錄的web頁面如下)
手機號為空時,顯示顯示“請輸入手機號”,作為斷言
代碼實現test_login.py:
"""登錄功能的測試用例""" import unittest from middware.handler import HandlerMiddle from config.config import Wait_time class TestLogin(unittest.TestCase): """登錄功能的測試類""" def test_login_error(self): """測試步驟 1.打開瀏覽器 2.訪問登錄頁面 3.元素定位+元素操作,輸入用戶名和密碼,點擊登錄 4.通過獲取頁面內容得到實際結果,進行斷言 :return: """ from selenium import webdriver #1.打開瀏覽器 driver = webdriver.Chrome() #設置隱性等待 等待的時間就可以放在config中,直接參數調用 ##方法一:放在yaml中 wait_time = HandlerMiddle.yaml_data["selenium"]["wait_time"] ##方法二、放在config.py中 #wait_time = Wait_time driver.implicitly_wait(wait_time) #2.訪問登錄頁面 url = "http://120.78.128.25:8765/Index/login.html" driver.get(url) #3.元素定位+元素操作,輸入用戶名和密碼,點擊登錄 driver.find_element_by_name("phone").send_keys("") #定位輸入手機號為空 driver.find_element_by_name("password").send_keys("")#定位輸入的密碼為空 driver.find_element_by_class_name("btn-special").click() #4.通過獲取頁面內容得到實際結果,進行斷言 #實際結果是在頁面上的提示,再次進行定位 actual_result = driver.find_element_by_class_name("form-error-info").text #斷言 self.assertTrue(actual_result == "請輸入手機號")
上面代碼實際結果中的text,是webelement對象直接調用的webelement.py文件中的text屬性。
源碼如下:
@property def text(self): """The text of the element.""" return self._execute(Command.GET_ELEMENT_TEXT)['value']
Command.GET_ELEMENT_TEXT,是Command類調用的類屬性(GET_ELEMENT_TEXT = "getElementText")
總結:自動化用例,是selenium基礎操作的組合,根據用例設置,操作瀏覽器和頁面。
78節
上面是異常用例的自動化實現,下面進行正常用例的實現。
一般情況下:步驟不同,寫不同的測試用例的函數(根據cases.xlsx測試用例的步驟編寫)。
正常用例,以登錄來說,登錄成功,會跳轉到登錄成功的頁面。與異常用例不同的是,獲取實際結果跟斷言
首先看下登錄成功后,定位“我的賬戶”,通過Xpath進行定位查找,//a[@href="/Member/index.html"]
代碼實現:
下面的斷言,賬戶信息,用包含關系in:寫關鍵字或者全稱都OK,(用 ==的話,要注意查看actual_result是否與預期結果一致,這里是預期結果是寫死的,后面再參數化)
def test_login_success(self): """登錄成功測試用例 1.打開瀏覽器 2.訪問登錄頁面 3.元素定位+元素操作,輸入用戶名和密碼,點擊登錄 4.通過獲取頁面內容得到實際結果,進行斷言 :return: """ from selenium import webdriver #1.打開瀏覽器 driver = webdriver.Chrome() #設置隱性等待時間 wait_time = HandlerMiddle.yaml_data["selenium"]["wait_time"] driver.implicitly_wait(wait_time) #2.訪問登錄頁面 url="http://120.78.128.25:8765/Index/login.html" driver.get(url) #3.元素定位+元素操作,輸入用戶名和密碼,點擊登錄 driver.find_element_by_name("phone").send_keys("159********") driver.find_element_by_name("password").send_keys("15******") driver.find_element_by_class_name("btn-special").click() #4.獲取實際結果,進行斷言 actual_result = driver.find_element_by_xpath("//a[@href='/Member/index.html']").text print(type(actual_result)) self.assertTrue("我的帳戶[小蜜蜂177872141]" in actual_result)
4.用例篩選 ---引入pytest
背景:為什么進行用例篩選?
雖然實現了異常用例,但是用的比較少,因為在web自動化測試中,大多數情況下都是正向測試,主流程測試、回歸測試、冒煙測試;跑主流程,比如登錄成功。
所以在編寫web自動化測試用例的時候,可以將用例全部編寫,但是測試的時候,要進行用例篩選,只跑成功的用例。
unittest框架:將成功的用例,手動一個個添加到測試集testsuite中:suite.addTests(),比較麻煩 (接口自動化中用的是discover,自動發現全部的測試用例,這里就無法實現篩選了,所以web不能用discover)
下面引入pytest 框架
安裝pytest: pip install pytest
pytest在web自動化方面更加智能,篩選用例方便 ------(pytest可以用於api,web,app自動化)
語法:(項目路徑下新建個pytest.ini文件,注冊標簽名)
1.在篩選的方法(用例)上,加“標簽”:@pytest.mark.標簽名
2.終端項目路徑下運行:pytest -m "標簽名"
下面運行登錄成功的用例結果:一共3個用例,只收集了成功的2個用例。
運行結果后謎案,有warning,打的mark標簽,pytest無法識別,並給出細節查看鏈接,
點擊鏈接查看:需要在pytest.ini文件中,把標簽添加上去,就不會有warning信息了。
在項目路徑下新建一個普通文件,命名為pytest.ini,將markers提前編寫好,就不會出warning了
擴展:pytest.ini文件
pytest.ini文件是pytest的主配置文件,可以改變pytest的運行方式,它是一個固定的文件,pytest.ini文件讀取配置信息,按指定的方式去運行。
pytest.ini的位置:一般放在項目工程的根目錄(即當前項目的頂級文件夾下)
總結:標記功能的步驟
①先注冊:在ini文件中,先注冊mark的 名字
②打標簽:測試用例函數上面@property.mark.標簽名
③運行指定的標簽用例:pytest -m "標簽名"
pytest模塊規則:
①自動智能發現用例:模塊名以test開頭、結尾(否則不會當做是測試用例)-----發現用例規則
②測試類,不能有__init__(self)初始化的方法-----測試用例的類不需要初始化
③方法(函數),必須以test_開頭,類必須時Test
④pytest測試用例函數可以脫離類,可以直接使用函數的形式(測試用例的py文件直接寫為函數)------unittest中無此用法
⑤類可以不繼承unittest.TestSuite
(修改規則,78節50min),了解規則可以修改即可
總結:pytest的優點
①靈活的篩選用例
②不需要手動加載用例(不需要導入加載器,運行器),不需要手動添加,手動運行,直接一行運行代碼即可。
③pytest可以兼容unit test(unit test不能兼容pytest)
執行測試:
1.可以在pycharm中直接右鍵,以pytest方式運行,但是這個pycharm解釋器的特有功能,不建議使用。可以在pycharm的終端中運行
-----如果的別人需要運行自己的自動化代碼,拷貝代碼到本機,可以直接在terminal中,cd到該項目的根目錄下,運行
2.運行 pytest testcase -sv 表示運行testcase目錄下的所有的測試用例
---- 加上testcase目錄,比較安全,萬一別的目錄中的函數有test_開頭,會被pytest檢測到當作用例執行了
---- -s 可以把用例中的print信息顯示出來
---- -v 顯示詳細的測試結果在terminal (可以組合表示為-sv)
---- 生成測試報告 --html=report.html --self-contained-html (其中,如果不加--self-contained-html ,會自動生成一個目錄,不需要該目錄就加上該這cmd)