selenium3自動化測試基於python3

一、selenium工具介紹

  • 簡介:selenium主要用於web應用程序的自動化測試, 支持多平臺(linux,windows,MAC),
    多語言(java,python,Ruby,JS), 多瀏覽器(谷歌,火狐IE,Edge,Opera)。

  • 版本: 有selenium1.0、2.0和3.0,即將推出4.0。

版本介紹:
selenium由插件、類庫組成

selenium1.0家族:selenium IDE、selenium Grid、selenium RC

  1. selenium IDE 嵌入到瀏覽器的一個插件,實現簡單的瀏覽器操作的錄製和回放功能。
    3.0後只有錄製和回放功能,不能導出腳本。
  2. selenium Grid 有Grid1和Grid2兩個版本,Grid2同時支持selenium1和selenium2兩種協議。
    Grid2不再提供單獨的包,其功能已經集成到selenium server中。

Grid工作原理:Grid是進行分佈式測試的工具,其整個結構由一個hub主節點和多個node代理節點組成。hub主節點管理代理節點的註冊和狀態信息,並且接收遠程客戶端代碼的請求調用,並且把請求的命令轉發給代理節點來執行。
可以在各個代理節點啓動不同的瀏覽器。

  1. selenium RC或者Selenium Remote Control selenium RC有Client Libraries和selenium Server。
    Client Libraries庫主要用於編寫測試腳本,用來控制selenium server的庫。 selenium Server負責控制瀏覽器的行爲。
    selenium Server分爲三部分:launcher、core和http proxy。其中core是被selenium server嵌入到瀏覽器頁面中的,其實是一堆javascript函數的集合,即通過這些javascript函數,實現用程序對瀏覽器進行操作。launcher用來啓動瀏覽器,將core加載到瀏覽器頁面中,並且將瀏覽器的代理設置爲http proxy。

    利用原理:JS代碼可以很方便地獲取頁面上的任何元素並進行操作。
    但注入JS代碼會觸發瀏覽器的同源策略,所以引入selenium Server,其中http proxy就是用來規避同源策略的。

selenium1.0的工作流程:

  1. 測試用例通過client libraries接口向selenium server 發送http請求,要求與selenium
    server 建立連接;
    (測試用例是在client libraries庫中基於不同語言java、python、ruby等編寫的)
  2. 建立連接後,selenium server 通過launcher驅動瀏覽器,並且把selenium
    core加載到瀏覽器頁面中,把瀏覽器代理設置爲server的http proxy;
  3. 測試用例向selenium server發送http請求,selenium server解析http請求,然後通過http
    proxy發送JS命令,通知core執行操作瀏覽器的動作;
  4. core執行JS命令,操作瀏覽器;
  5. 如果瀏覽器接收到新的頁面請求信息時,發送http請求,請求新的web頁面; (由於Launcher在啓動 瀏覽器時把Http
    Proxy設置成爲了瀏覽器的代理,所以Selenium RC Server會接收到所有由它啓動 的瀏覽器發送的請求。)
  6. selenium server接受到新的http請求並解析後,重組http請求以規避“同源策略”,獲取對應的web頁面;
  7. selenium server通過http proxy把接收到的web頁面返回給瀏覽器。

課外小知識:

  • 同源策略:同源是指域名、協議和端口相同。 當一個瀏覽器打開兩個tab,分別是百度和搜狗。
    在百度tab頁下執行一個腳本時會先檢查該腳本是哪個網頁的,只有同源纔會被執行。

selenium2.0

  • selenium2.0 = selenium1.0 +webdriver selenium2.0的webdriver是selenium
    RC的代替品,但是並沒有完全拋棄selenium RC。

利用的原理:

  • 將瀏覽器原生的api封裝成webdriver api,直接控制瀏覽器。

webdriver的工作原理:

webdriver是典型的client-server模式

  1. 使用selenium2.0啓動瀏覽器時,後臺也同時將基於webdriver wire協議的web service作爲web server,並將瀏覽器綁定到特定端口;
  2. 測試腳本作爲client,將需要執行的頁面操作以http請求發送給web server,其中http請求的body,是以webdriver wire協議的Json格式的字符串告訴瀏覽器接下來的操作;
  3. web server解析請求,並將請求結果發送給webdriver;
  4. 由於webdriver封裝了瀏覽器原生的api,所以可以直接控制瀏覽器。

selenium3.0

  • 增加了edge和Safari原生的驅動,且徹底拋棄selenium RC。

二、web端的UI自動化測試

1、自動化測試框架:
selenium-webdriver
2、windows下的測試環境搭建:

python3.7.3 + selenium3.14 + chrome69+ chromedriver2.37 +win10
課外小知識:

  • Pycharm是python的IDE之一(集成開發環境),也就是編輯器
  • anaconda是一個開源的python發行版本,其包含python和python的第三方庫
  • selenium是一個用於web應用程序的自動化測試工具

(1)安裝python,安裝anaconda也就安裝了python,並且把python安裝目錄添加到系統環境變量的path;
anaconda安裝教程:https://blog.csdn.net/ITLearnHall/article/details/81708148

(2)安裝selenium,如果是pycharm,在python安裝目錄D:\pycharm\Anaconda3_2018.12\Scripts下執行pip install selenium;
pycharm安裝教程:https://www.cnblogs.com/dcpeng/p/9031405.html
pycharm生成註冊碼:http://idea.lanyus.com/

(3)chrome.exe和chromedriver.exe兩者的版本要適配,chromedriver.exe放在chrome.exe路徑下,並且將chromedriver.exe的安裝目錄添加到系統環境變量的path。

(4)HTMLTestRunner.py放在python的lib文件中

3、gitlab項目管理
科普:
git是一個分佈式版本管理系統,實現在線代碼託管。
gitlab是在線代碼託管平臺。
步驟:
(1)git bash安裝

(2)gitlab註冊郵箱賬號:https://gitlab.com/

(3)建立連接

  • 本地git和gitlab服務器之間保持通信,是通過SSH KEY。
    課外小知識:
  • sourcetree是開源git軟件,是可視化界面工具,具有完整的git功能。
  • fork是git客戶端,在Windows中比sourcetree更友好。

sourcetree和Gitlab的連接步驟:

或者
fork和gitlab的連接:

  • file—configure ssh keys
  • generate new SSH key,key file name輸入id_rsa,郵箱輸入gitlab註冊的郵箱,即可生成祕鑰

在這裏插入圖片描述

  • 在gitlab的profile settings 的SSH keys點擊add ssh key,將上一步生成的祕鑰複製到gitlab

(4)gitlab new project , fork clone 文件到本地,本地會同時生成該文件夾

4、持續集成jenkins構建
課外小知識:

  • 持續集成:持續集成是一種軟件開發實踐,即開發人員經常集成他們的工作。
  • Jenkins 是基於 Java 開發的一種持續集成工具。
  • Tomcat 是針對 Java 的一個開源中間件服務器(容器),基於 Java Web 的項目需要藉助 Tomcat 才能運行起來。
    環境搭建:
    java環境+tomcat+jenkins

5、自動化測試項目架構:
在這裏插入圖片描述

  • web:用於存放社區web項目的測試用例web_case、測試報告report
  • report:創建用於存放測試報告.html
  • package:用於存放自動化所用到的擴展包,如HTMLTestRunner.py
  • web_case:測試用例目錄,用於存放測試用例*web_.py、公共模塊models、頁面對象page_obj
  • web_runtest.py:項目主程序。用於運行社區web自動化測試用例
  • web文檔:項目結構介紹和使用說明

三、自動化測試項目實戰

1、項目是否適合自動化測試
(1)項目已有的模塊功能基本穩定,UI界面沒有大的改動,項目在開發新的模塊,新的功能
(2)項目版本迭代頻繁,每次發版時都需要進行冒煙測試,很耗時耗力。

2、自動化用例設計
(1)不是所有的手工用例都要轉換爲自動化測試用例。
(2)流程太複雜,難以用腳本實現自動化的用例,不建議開發。
(3)用例要有目的性,比如用作迴歸測試、冒煙測試。
(4)可以選取重複執行,煩瑣的用例,可以讓測試人員從重複煩瑣的測試解脫。
課外小知識

  • 迴歸測試:修改代碼後驗證Bug已修改並且沒有引入新的錯誤。
  • 冒煙測試:新的版本發佈前要驗證保證項目的基本功能沒問題。

3、自動化測試用例編寫原則
(1)一個用例爲一個完整的場景,從用戶登錄到關閉瀏覽器。
但是,用例達到上百個甚至更多時,可以只登錄一次,再執行上百個用例,最後再關閉瀏覽器。這樣可以節省時間。
(2)一個用例只驗證一個功能點。比如,用例1驗證用戶登錄密碼爲空,用例2驗證用戶登錄用戶名爲空。
(3)用例與用例之間儘量避免依賴。能做到最好,做不到也沒關係。比如,編輯功能和刪除功能總是依賴新增功能。
(4)一個用例完成測試之後需要對測試場景進行還原,以免影響其他用例的執行。比如搜索功能,搜索關鍵詞後要清空搜索框的內容

4、採用Page Object設計模式

  • 實現對界面細節的封裝,將業務和界面細節分開來。

優點:

  • 減少代碼的重複。因爲多個用例會重複定位某個元素
  • 提高測試用例的可讀性。
  • 提高測試用例的可維護性。

5、Unittest單元測試框架

在web自動化測試中的作用:

  • 組織和執行用例
  • 提供斷言方法,用例執行完後將實際結果與預期結果進行比較(斷言)
  • 提供豐富的日誌:用例執行失敗時拋出原因,以及執行結果:失敗用例數、成功用例數

課外小知識:

  • 單元測試的定義:負責對最小的軟件設計單元進行驗證,根據軟件設計文檔對重要的程序分支進行測試以發現模塊中的錯誤

(1)組織和執行用例

  • setUp,tearDown:是對每一個用例的初始化和用例執行完成後的清理工作,一般用來關閉瀏覽器;
    在多個用例中,如果某個用例的元素定位或者其他出錯,會阻止用例的繼續運行。
  • setUpClass,tearDownClass:是在執行用例之前初始化一遍,所有的用例執行完後再進行清理工作,
    並且在setUpClass和tearDownClass的上面添加@classmethod裝飾器,如果某個用例的元素定位或者其他出錯,
    不影響整個用例的執行工作;這樣也許會更好一些,不用每次都去重新打開瀏覽器,節省測試時間,
    但要注意的是不要忽略了用例之間的相互影響,所以用這種模式要考慮到用例之前的耦合, 儘可能不要讓前個用例的測試環境影響後一個用例的執行。

web_init.py的代碼:

  • 執行所有測試用例的前置條件、後置條件
  • 啓動瀏覽器
#繼承unittest模塊的TestCase類,TestCase類是對特定類進行測試的集合
class MyTest(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        options=Options()
        #設置chrome瀏覽器無界面模式
        options.add_argument('window-size=1600x746')#指定瀏覽器全屏
        options.add_argument('--headless')#瀏覽器不提供可視化頁面
        cls.driver = webdriver.Chrome(
            executable_path="C:/Users/xiehuagui/AppData/Local/Google/Chrome/Application/chromedriver.exe",options=options)

    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()
        
  • discover:查找並執行測試用例
    runtest.py的代碼:
  • 查找測試目錄(zhsq_dir)中('test*.py)開頭的測試用例文件並執行
import unittest
import os
#獲取當前工作路徑,並且把雙斜杆換成反斜杆
home_dir = str(os.getcwd()).replace("\\", "/")
zhsq_dir = home_dir + '/test_case'
discover = unittest.defaultTestLoader.discover(zhsq_dir, pattern='test*.py')
if __name__ == '__main__':
    runner = unittest.TextTestRunner()
    runner.run(discover)
  • main()方法
    main()方法是unittest提供的全局方法,可以使模塊直接運行
    main()方法提供TestLoader類搜索“test”開頭的測試方法,並自動執行它們。

課外小知識:
.py文件有兩種使用方法:作爲模塊被調用和直接使用。
if name ==“main”:
name 是模塊的內置屬性,當__name__ =="main"時表示模塊直接使用

if __name__ =="__main__":
    unittest.main()
  • 用例的執行順序
    unittest框架默認根據ASCII碼的順序加載測試用例,順序爲:0-9,A-Z,a-z。對於測試目錄和測試文件也是這樣。
    測試目錄的命名:
    在這裏插入圖片描述
    測試用例的命名:
class SysOrggan(web_init.MyTest):
    '''系統管理--組織管理'''

    #@unittest.skip("跳過")
    def test_01org_add(self):
        '''新增功能'''
        ...
    def test_02org_edit(self):
        '''編輯功能'''
        ...
    def test_03org_del(self):
        '''刪除功能'''
        ...

(2)提供斷言方法
assertEqual(a,b):檢查a=b
assertNotEqual(a,b):檢查a!=b

self.assertEqual(tree_num2,tree_num1-1, msg="刪除失敗")

(3)提供日誌

在這裏插入圖片描述

四、實現自動化的細節,跟代碼有關

1、在網友分享的測試報告基礎上,優化HTML測試報告

2、返回用例狀態碼給Jenkins,一旦用例不通過就觸發Jenkins自動發郵件

def is_result_pass():
    try:
        fp = open(filename, "r" , encoding="UTF-8")
        # 讀報告
        f = fp.read()
        soup = BeautifulSoup(f, "html.parser")
        status = soup.find_all(class_="attribute")
        # 獲取報告結果
        result = status[3].contents[-1]
        if "錯誤" in result or "失敗" in result:
            exit(1)
        else:
            exit(0)
    except Exception as msg:
        print("判斷過程出現異常:%s"%str(msg))
        return False

在這裏插入圖片描述

代碼解析:可以通過html測試報告中的測試結果來判斷用例是否通過,根據class_="attribute"定位,status[3]就是測試結果,測試結果有兩行內容,contents[-1]表示最後一行內容。如果“錯誤”和“失敗”不爲0,則返回exit(1)給jenkins,就會觸發jenkins發郵件。

3、元素的定位
(1)Xpath定位:

  • 對於模塊位置容易改變的項目,不建議使用絕對路徑定位
button_loc = (By.XPATH,‘//*[@id="main"]/div/div[1]/div/ul/div[1]/li/ul/div[1]/li/span’)
  • 可以利用元素屬性定位
root_add_button_loc = (By.XPATH,'//*[@id="WY-0-add"]')

(2)CSS定位

  • 組合定位

點號(.):class屬性
#號(#):id屬性
大於號(>):div>input:父子關係
加號(+):div+input:兄弟關係
空格( ):div input:div的所有input元素,包括子元素,孫元素,曾孫元素…

xq_node_loc = (By.CSS_SELECTOR,"span#arrow-2+div div.tree-node-title")

(3)調用JS定位元素

  • webdriver提供了execute_script()方法執行JS代碼。
js_root_add_xq = "document.getElementById('WY-0-addXQ').click()"
driver.execute_script(js_root_add_xq)

(4)如果以上都無法定位,測試人員就自己手動給元素加id等屬性

參考文獻:
1、selenium1.0 和2.0介紹:https://www.cnblogs.com/ZoeLiang/p/10746787.html
2、蟲師,selenium2自動化測試實戰基於python語音(書籍)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章