1. 程式人生 > >python 和 selenium實現web UI功能自動化測試框架(米兔888)

python 和 selenium實現web UI功能自動化測試框架(米兔888)

之前分享了python和requests搭配實現的介面自動化測試框架,今天,我再來整理分析下基於python和selenium的web UI自動化測試,希望能對大家有所幫助,也是自己整理知識學習的方法,跟大家一起努力,奮鬥在自動化測試的道路上。

其實UI自動化和介面自動化框架的設計思路大同小異,主要目的還是分離業務程式碼和測試資料,達到程式碼的複用,提高測試用例的可維護性以及最最重要的減少人工勞動力。那麼就開始直接看正文吧。

設計目的:

分離業務程式碼和測試資料,提高程式碼可維護性,實現自動化,減少重複勞動,最終達到“偷懶”的目的,哈哈哈哈哈~~ 哎呦,不好意思,一不小心暴露了真相。小編是真的在一本正經的寫程式碼啦。

框架目錄結構:

        case:存放具體的測試程式碼

        comm:存放共通的方法

        file:存放測試用例等測試過程中用到的測試資料

        result:每次測試的log和測試報告的存放位置

        caseList:規定執行哪些測試

        config:配置靜態資料

                                                                readConfig:讀取config檔案內容

                                                                runAll:測試執行入口檔案

一起來看整個框架的搭建。

首先,要保證你的python已經安裝了selenium包,如果你是用pip來管理自己的python環境的,那麼你可以通過下面的命令來匯入selenium模組:

pip install selenium

然後,你需要到網上去下載對應瀏覽器的驅動,這裡小編使用的是chrome瀏覽器,(chrome下載地址:http://chromedriver.storage.googleapis.com/index.html)。下載完成之後呢,將下載的瀏覽器驅動放到本地的python安裝目錄下,這樣就可以直接在框架中使用了。至此,必備的條件都有了,我們就可以開工啦。

這裡呢,我們就只挑部分內容進行講解,有許多跟介面測試框架相同或相似的方法和檔案,就不一一進行二次說明了,第一次看的盆友們,有不明白的地方可以看這篇文章,進行補充學習

https://my.oschina.net/u/3041656/blog/820023

開啟瀏覽器:

from selenium import webdriver

classDriver:

    def__init__(self):
        
        self.browser = webdriver.Chrome()

    defopen_browser(self):
        """
        Do something for browser
        :return: browser
        """
        # 視窗最大化
        self.browser.maximize_window()

        # 開啟地址連結
        url = 'http://www.baidu.com'
        self.browser.get(url)
        return self.browser

    defclose_browser(self):
        """
        quit browser
        :return:
        """
        self.browser.quit()

從上面的程式碼可以看出,我們進行了開啟/關閉瀏覽器的方法定義,只有簡單的幾行程式碼,當然了,這裡為了方便大家觀看,我把url地址直接寫了出來,在實際操作時,我們可以將其抽離出來,根據自己的需要,傳入不同的url地址。這就留著讓大家去自己實現吧。

一個簡單的搜尋栗子:

from time import sleep
from selenium import webdriver
import unittest


classLogin(unittest.TestCase):

    defsetUp(self):
        self.driver = webdriver.Chrome()

        # 視窗最大化
        self.driver.maximize_window()
        self.msg = '海賊王'
        self.url = 'http://www.baidu.com'

    deftestSearch(self):
        """
        test body
        :return:
        """
        # open browser
        self.driver.get(self.url)
        sleep(3)
        # click search input
        self.driver.find_element_by_id('kw').click()
        sleep(1)

        # input value
        self.driver.find_element_by_id('kw').send_keys(self.msg)
        sleep(1)
        self.driver.find_element_by_id('su').click()
        sleep(1)

    deftearDown(self):
        self.driver.close()

if __name__ == "__main__":
    unittest.main()

在上面的程式碼裡,我們在百度裡搜尋了小編最愛的動漫,嘻嘻,是不是很開心啊,就這樣邊學邊玩耍,感覺測試也是美美的。

selenium可以通過很多種方式來定位元素。這個讀者可以自行學習。

大家看到了,這就是UI測試的雛形,有了這個雛形,我們就可以對它進行擴充套件,擴充套件,最後搭出框架來。

新增log日誌:

在上面的基礎上,我們可以新增執行時輸出的log日誌。所以開始寫log檔案,並將它放在comm資料夾下,作為共同方法來用。這部分內容在介面測試框架那裡已經介紹過了,所以請還不清楚的朋友們移步此處:https://my.oschina.net/u/3041656/blog/820023

抽離出瀏覽器的相關操作:

我們可以將對瀏覽器的操作剝離出來,單獨放到一個檔案中,這樣既清晰,又避免了重複的程式碼操作。而且維護起來也比較方便。

from selenium import webdriver
from comm.Log import MyLog as Log
import readConfig
import threading

localReadConfig = readConfig.ReadConfig()


classDriver:

    def__init__(self):
        self.log = Log.get_log()
        self.logger = self.log.get_logger()

        self.browser = webdriver.Chrome()

    defopen_browser(self, name1, name2):
        """
        Do something for browser
        :return: browser
        """
        self.logger.info("Open browser")

        # 視窗最大化
        self.browser.maximize_window()

        # 開啟地址連結
        url = localReadConfig.get_webServer(name1, name2)
        self.browser.get(url)
        return self.browser

    defclose_browser(self):
        """
        quit browser
        :return:
        """
        self.browser.quit()
        self.logger.info("Quit browser")

    defget_driver(self):
        """
        get web driver
        :return:
        """
        return self.browser


classMyDriver:

    driver = None
    mutex = threading.Lock()

    def__init__(self):
        pass

    @staticmethod
    defget_browser():

        if MyDriver.driver is None:
            MyDriver.mutex.acquire()
            MyDriver.driver = Driver()
            MyDriver.mutex.release()

        return MyDriver.driver

if __name__ == "__main__":
    driver = MyDriver.browser()
    browser = driver.open_browser()

以上便是小編剝離出來的部分,並且將它放到了單獨的執行緒中。

有木有覺得眼熟呢?其實就跟log的原理是一樣的啦。這就是“舉一反三”哦,套路就是那個套路,就看你怎麼用了。

關於Element的那些事兒:

做過UI功能測試的朋友們應該都知道,元素是我們測試最基本也是最重要的東西,以為它是我們直接的操作物件,所以,處理好它們,我們就會省掉很多的麻煩,所以呢,接下來,小編將會繼續分享自己處理element的一些方法,希望能對大家有所幫助,如果哪位大神有更好的方法,請一定要告訴小編哦!小編在此先謝過了!

classElement:

    def__init__(self, activity_name, element_name):

        self.driver1 = Driver.get_browser()
        self.driver = self.driver1.get_driver()
        self.activity = activity_name
        self.element = element_name
        element_dict = get_el_dict(self.activity, self.element)
        self.pathType = element_dict.get('pathType')
        self.pathValue = element_dict.get('pathValue')

    defis_exist(self):
        """
        Determine element is exist
        :return: TRUE OR FALSE
        """
        try:
            if self.pathType == 'ID':
                self.driver.find_element_by_id(self.pathValue)
                return True
            if self.pathType == 'XPATH':
                self.driver.find_elements_by_xpath(self.pathValue)
                return True
            if self.pathType == 'CLASSNAME':
                self.driver.find_element_by_class_name(self.pathValue)
                return True
            if self.pathType == 'NAME':
                self.driver.find_element_by_name(self.pathValue)
                return True
        except NoSuchElementException:
            return False

    defwait_element(self, wait_time):
        """
        wait element appear in time
        :param wait_time: wait time
        :return: true or false
        """
        time.sleep(wait_time)
        if self.is_exist():
            return True
        else:
            return False

    defget_element(self):
        """
        get element
        :return: element
        """
        try:
            if self.pathType == 'ID':
                element = self.driver.find_element_by_id(self.pathValue)
                return element
            if self.pathType == 'XPATH':
                element = self.driver.find_elements_by_xpath(self.pathValue)
                return element
            if self.pathType == 'CLASSNAME':
                element = self.driver.find_element_by_class_name(self.pathValue)
                return element
            if self.pathType == 'NAME':
                element = self.driver.find_element_by_name(self.pathValue)
                return element
        except NoSuchElementException:
            return None

    defget_element_by_index(self, index):
        """
        get element by index
        :param index: index
        :return: element
        """
        try:
            if self.pathType == 'ID':
                element = self.driver.find_element_by_id(self.pathValue)
                return element[index]
            if self.pathType == 'XPATH':
                element = self.driver.find_elements_by_xpath(self.pathValue)
                return element[index]
            if self.pathType == 'CLASSNAME':
                element = self.driver.find_element_by_class_name(self.pathValue)
                return element[index]
            if self.pathType == 'NAME':
                element = self.driver.find_element_by_name(self.pathValue)
                return element[index]
        except NoSuchElementException:
            return None

    defget_element_list(self):
        """
        get element list
        :return: element list
        """
        try:
            if self.pathType == 'ID':
                element_list = self.driver.find_element_by_id(self.pathValue)
                return element_list
            if self.pathType == 'XPATH':
                element_list = self.driver.find_elements_by_xpath(self.pathValue)
                return element_list
            if self.pathType == 'CLASSNAME':
                element_list = self.driver.find_element_by_class_name(self.pathValue)
                return element_list
            if self.pathType == 'NAME':
                element_list = self.driver.find_element_by_name(self.pathValue)
                return element_list
        except NoSuchElementException:
            return None

    defclick(self):
        """
        click element
        :return:
        """
        element = self.get_element()
        time.sleep(1)
        element.click()

    defsend_key(self, key):
        """
        input key
        :param key: input value
        :return:
        """
        element = self.get_element()
        time.sleep(1)
        element.clear()
        element.send_keys(key)

    definput_keys(self, index, key):
        """
        By index send key
        :param index: index
        :param key: key
        :return:
        """
        element = self.get_element_by_index(index)
        time.sleep(1)
        element.clear()
        element.send_keys(key)

    defget_text_value(self):
        """
        get attribute
        :return:
        """
        element = self.get_element()
        value = element.get_attribute('text')
        return str(value)

這是小編寫的,目前能用到的關於element的方法了,累覺不愛啊~

但是,生活還要繼續,工作還未完成。所以,請讓我講完剩下的程式碼吧!!!

那些讓人費神的測試資料檔案:

每一個好的測試,都離不開一份好的測試用例資料,那麼,這麼多的資料,我們要怎樣進行管理才能既不亂又方便以後對資料進行更改維護呢?下面,小編就要告訴朋友們一個重磅訊息,敲黑板!!!

其實,小編也不知道有什麼好辦法,小編就是使用excel檔案來對測試用例進行統一管理的。請看下面:

形式就是這麼個形式,內容就隨便你們怎麼修改了。畢竟我也只能幫你們到這裡了。至於對excel檔案內容的讀取,在介面測試那篇博文中也有詳細介紹哦。不明白的同學請移步:https://my.oschina.net/u/3041656/blog/820023

其實,出來測試用例,還有一個數量龐大的資料群體,快猜猜它們是誰???

噹噹噹,答案就是:元素定位的資料,包括:id,name,classname,xpath等等,這些資料可是我們在測試過程中找到頁面元素的不二法門哦。。。所以各位朋友一定要注意啦,一定要處理好它們。

請看下面:

愚蠢的小編就用xml檔案來管理啦。

是不是又有人想問怎麼讀取xml檔案了?嘿嘿。。。我不會告訴你的,因為我在前面的博文裡已經講過啦!講過啦!過啦!啦!!

至此呢,今天的內容也結束了,希望對大家有所啟發和幫助,雖然講的有些凌亂,不過只要弄懂了這些劃分和實現方法,我相信,你也一定可以寫出自己滿意的UI自動化測試框架。所以,我們一起加油吧。

本文為原創文章,轉載請註明原文地址,謝謝大家的支援。希望大家一起努力成長。

如果覺得本文的文章寫得很好,打個賞,多少都行~~~


如果覺得本文的文章寫得很好,打個賞,多少都行~~~

相關推薦

python selenium實現web UI功能自動化測試框架888

之前分享了python和requests搭配實現的介面自動化測試框架,今天,我再來整理分析下基於python和selenium的web UI自動化測試,希望能對大家有所幫助,也是自己整理知識學習的方法,跟大家一起努力,奮鬥在自動化測試的道路上。其實UI自動化和介面自動化框架的

UI自動化測試框架:Appium基礎

申明:本章節引用很多第三方資料和網上的教程,在參考資料tab中我都有備註,請理解。 由於該框架是基於Appium的,所以先講講appium的基礎知識 一:Appium介紹 Appium是由nodejs的express框架寫的Http Server

python+requests介面自動化測試框架例項詳解教程888

前段時間由於公司測試方向的轉型,由原來的web頁面功能測試轉變成介面測試,之前大多都是手工進行,利用postman和jmeter進行的介面測試,後來,組內有人講原先web自動化的測試框架移駕成介面的自動化框架,使用的是java語言,但對於一個學java,卻在學python的我

基於Python圖靈機器人的圖靈測試系統--20180522人工智慧作業

人工智慧課程實驗報告實驗二基於Python和圖靈機器人的圖靈測試系統姓名郭暢院系電腦科學與技術學院學號153921015實驗地點理工樓二棟二樓實驗時間2018.5.22實驗課表現出勤、表現得分實驗報告得分實驗總分操作結果得分實驗目的:結合百度圖靈機器人介面,自己更新相應的語料

robot framework + python實現http接口自動化測試框架

accept testsuite def max IV 每一個 聯系 ria method https://www.jianshu.com/p/6d1e8cb90e7d 前言 下周即將展開一個http接口測試的需求,剛剛完成的java類接口測試工作中,由於之前犯懶,沒有

python+selenium自動化測試框架1)

python+selenium自動化測試框架(1) 自己第一次寫部落格,一方面想提高自己的寫作能力,另一方面,自己花費時間解決的問題,記錄下來,以後要是忘記啦,可以隨時檢視,當然要是大家碰到和我一樣的問題,也是可以檢視的 我用的是python3.6 一:python中實現程式碼與資料

python+selenium自動化測試框架2)

HTMLTestRunner自動化生成測試報告的使用 這個本人也是第一次使用這個工具,python2是可以直接使用的,但是python3.0不能直接拿來使用它。需要進行修改: 他是存在python裡面的lib資料夾裡面 開啟你的HTMLTestruner.py檔案: 第94行,將import

Python&Selenium&Unittest&BeautifuReport 自動化測試並生成HTML自動化測試報告

一、摘要 本篇博文將介紹如何藉助BeautifulReport和HTML模版,生成HTML測試報告的BeautifulReport 原始碼Clone地址為 https://github.com/TesterlifeRaymond/BeautifulReport,其中 BeautifulReport.py和

基於webdriver的web UI自動化測試框架系統架構+測試指令碼應用架構

1.首先是自動化測試系統架構如下圖: 2.測試指令碼的應用架構: 3實際應用後的工程結構: 框架的配置檔案(只是簡單的用properties檔案) #------------------# #  測試框架配置 #------------------# #

selenium實現登入頁面的自動化測試

# -*- coding:utf-8 -*- import sys reload(sys) sys.setdefaultencoding("utf-8") from selenium import webdriver import unittest class Log

Web UI 優化自動化測試用例的穩定性

     Web UI自動化測試的一個很重要的問題就是整個測試的穩定性,經常在執行測試的時候出現這樣或那樣的問題,而且大多都是穩定性問題,而非BUG,最近我針對同事的用例的穩定性問題做了些優化策略,

基於httpclientmysql的介面功能自動化測試框架

最近一直在做httpclient介面測試,功能自動化的框架1.0算是初步完成,中間遇到了很多問題,學到了不少知識,基本思想是mysq結合testNG,在去用jekins整合。分享一下自己做的PPT。 簡介: 1.語言:java (1)基礎語法 (2)基本資料型別 (3)ja

Python3-Selenium自動化測試框架selenium使用元素定位

Selenium自動化測試框架(二)之selenium使用和元素定位 (一)selenium的簡單使用 1、導包 from selenium import webdriver 2、初始化瀏覽器 # 驅動在python環境中 browser = webdriver.Chrome() # 驅動不放在python環

2019年 Selenium3與Python3實戰Web自動化測試框架最新50G

第1章 課程介紹本章對課程做整體介紹,通過講解web自動化測試需要掌握的知識,到web自動化測試框架的選擇,框架的搭建。1-1 課程介紹 第2章 環境搭建本章講解自動化測試環境的搭建,並通過實際專案實戰講解selenium3的基礎知識,對常用的api進行徹底的分析、設計,再到如何去編寫自動化測試指令碼。2-

python介面自動化測試框架post提交新增變數

1、python介面測試框架包含哪幾部分 資料來源-> GET/POST 傳送請求->接收返回結果->斷言測試結果->生成測試報告(html報告)->網頁報告   2、python介面測試框架 config:存放配置檔案,比如資料庫設定、郵件配置、log配置

Selenium 2自動化測試實戰高清版PDF

Selenium 2自動化測試實戰(高清版)PDF百度網盤連結:https://pan.baidu.com/s/1aiP3d8Y1QlcHD3fAlEj4sg 提取碼:jp8e 複製這段內容後開啟百度網盤手機App,操作更方便哦內容簡介 · · · · · · 《Selenium 2自動化測試實戰——基於Py

基於APPIUM測試微信公眾號的UI自動化測試框架結合Allure2測試報告框架

clas ava sed rom pos enabled via 代碼管理 ons 框架初衷 前兩周組內的小夥伴跟我說她現在測試的微信公眾號項目(保險)每次上新產品時測試起來很費時,存在大量的重復操作(點點點),手工測試每個產品可能需要半天到一天的時間,復雜的產品需要兩

Appium+python自動化測試框架自動生成html,自動截圖,執行完成後自動傳送到郵箱

這段時間一直在學習Appium,為了更方便自己的實踐,所以自己寫了一個Appium測試框架 框架實現了在執行完成以後,自動將最新的HTML檔案與在驗證過程中的截圖(自動壓縮成資料夾)傳送到指定郵箱 結合jenkins完全可以實現全自動化,如果需要框架請加我微信,可以免費提供

webUI自動化測試框架:簡介Demo入門

前言:selenium和webdriver是目前主流的ui自動化測試框架之一,selenium又稱為selenium RC,基本原理為js注入,而webdriver是直接利用了瀏覽器的native support(廠商支援)來操作瀏覽器,所以,對於不同瀏覽器,必須依賴一個特

基於python flask的自動化測試平臺 寫在序言

       學習python自動化測試已經有一段時間了,目前在公司也已經自制了一個簡單自動化測試平臺,其中包括了專案管理、模組管理、用例管理、自動生成測試報告、檢視測試報告、介面自動化用例批量執行、單點除錯、UI自動化用例執行。基本上能滿足公司自動化測試的要求,只是還有很多