Selenium3與Python3實戰 Web自動化測試框架(三)


 Selenium3與Python3實戰 Web自動化測試框架


 

 一、關鍵字模型

 excel表:

 關鍵字模型

 

 

通過代碼實現:讀取excel表中上述數據,進行一系列操作,實現自動打開網頁、輸入信息並跳轉

1、excel_operation.py: excel表基本讀寫操作:

import xlrd   # 需安裝
from xlutils.copy import copy  # xlutils 需安裝
import time
from setting.setting import excel_path
class Excel_Opertion(object):
    """excel表數據相關操作"""

    def __init__(self,ex_path=None,index=None):
        if ex_path == None:
            self.excel_path = excel_path  # 默認excel文件路徑
        else:
            self.excel_path = ex_path
        if index == None:
            index = 0
        self.data = xlrd.open_workbook(self.excel_path)
        self.table = self.data.sheets()[index] # sheets第一頁數據

    # 獲取excel數據,按照每行一個list,添加到一個大的list里面
    def get_data(self):
        result = []
        rows = self.get_lines()
        if rows !=None:
            for i in range(1,rows):
                row = self.table.row_values(i)
                # print(row)   # ['test001@qq.com', 'Mushishi001', '111111', 'code', 'user_email_error', '請輸入有效的電子郵件地址']
                result.append(row)   # [['test001@qq.com', 'Mushishi001', '111111', 'code', 'user_email_error', '請輸入有效的電子郵件地址'], ['test002.com', 'Mushishi002', '111112', 'code', 'user_email_error', '請輸入有效的電子郵件地址']]
            return result
        return None

    # 獲取excel行數
    def get_lines(self):
        rows = self.table.nrows  # 獲取行數
        if rows > 1:
            return rows
        return None

    #獲取單元格的數據
    def get_col_value(self,row,col):
        #print
        if self.get_lines()>row:
            data = self.table.cell(row,col).value
            return data
        return None


    #寫入數據
    def write_value(self,row,value):
        read_value = xlrd.open_workbook(self.excel_path) # 打開excel文件
        write_data = copy(read_value)  # 復制文件,讓xlutils模塊相關操作表
        write_data.get_sheet(0).write(row,9,value)  # 獲取excel表首頁數據,並在row行9列寫入數據
        write_data.save(self.excel_path)   # 保存
        time.sleep(1)

 2、excel_cell_value.py:讀取excel表中各列的數據:

from util.excel_operation import Excel_Opertion

class Get_Cells_Value(object):
    """獲取keyword.xls表單元格數據"""
    def __init__(self,excel_path):
        self.case_id = 0    # id
        self.case_name = 1  # 模塊名稱
        self.action_type = 2     # 操作類型:打開瀏覽器、輸入用戶名...
        self.is_run = 3          # 是否執行
        self.action_method = 4   # 執行方法
        self.send_value = 5      # 發送的數據
        self.oper_element = 6    # 操作元素
        self.expect_result = 7   # 預期結果
        self.real_result = 8     # 實際結果
        self.report_result = 9   # 實際報告,是否通過

        self.excel_path = excel_path
        self.excel_oper = Excel_Opertion(self.excel_path)  # 實例化
        self.get_lines = self.excel_oper.get_lines()  # 獲取行數


    def get_case_id(self,row):
        # 獲取case id
        case_id = self.excel_oper.get_col_value(row,self.case_id)
        return case_id

    def get_case_name(self,row):
        # 獲取case名稱
        case_name = self.excel_oper.get_col_value(row,self.case_name)
        return case_name

    def get_is_run(self,row):
        # 獲取是否執行:yes/no ,用於判斷該case是否運行
        is_run = self.excel_oper.get_col_value(row,self.is_run)
        return is_run

    def get_action_method(self,row):
        # 獲取操作的方法
        action_method = self.excel_oper.get_col_value(row,self.action_method)
        return action_method

    def get_send_value(self,row):
        # 獲取要輸入的數據
        send_value = self.excel_oper.get_col_value(row,self.send_value)
        return send_value

    def get_oper_element(self,row):
        # 獲取操作的元素
        oper_element = self.excel_oper.get_col_value(row,self.oper_element)
        return oper_element

    def get_expect_result(self,row):
        # 獲取預期結果
        expect_result = self.excel_oper.get_col_value(row,self.expect_result)
        return expect_result

    def get_real_result(self,row):
        # 獲取實際結果
        real_result = self.excel_oper.get_col_value(row,self.real_result)
        return real_result

    def get_report_result(self,row):
        # 獲取報告
        report_result = self.excel_oper.get_col_value(row,self.report_result)
        return report_result

 

3、actionMethod.py:對應excel表中第 5列的 執行方法,實現:打開瀏覽器、定位對應元素、實現自動輸入信息、關閉瀏覽器等:

#coding=utf-8
from selenium import webdriver
from base.find_element import FindElement
import time
class ActionMethod(object):
    """用於執行 keyword.xls表指定方法"""
    #打開瀏覽器
    def open_browser(self,browser):
        try:
            if browser == 'chrome':
                self.driver = webdriver.Chrome()
            elif browser == 'firefox':
                self.driver = webdriver.Firefox()
            else:
                self.driver = webdriver.Edge()
        except:
            print("ActionMethodError:沒有'{}'這個元素".format(browser))
        
    #輸入地址
    def get_url(self,url):
        try:
            self.driver.get(url)
        except:
            print("ActionMethodError:url:{},輸入有誤".format(url))
    
    #定位元素
    def get_element(self,key):
        try:
            find_element = FindElement(self.driver)
            element = find_element.get_element(key)
            return element
        except:
            print("ActionMethodError:'{}'元素定位失敗".format(key))
    
    #輸入信息
    def element_send_keys(self,value,key):
        try:
            element = self.get_element(key)
            element.send_keys(value)
        except:
            print("ActionMethodError:輸入有誤:'{}'".format(value))
    
    #點擊元素
    def click_element(self,key):
        try:
            self.get_element(key).click()
        except:
            print("ActionMethodError:'{}'元素不存在,無法點擊".format(key))
    
    #等待
    def sleep_time(self):
        time.sleep(3)
    
    #關閉瀏覽器
    def close_browser(self):
        self.driver.close()
    
    #獲取title
    def get_title(self):
        title = self.driver.title
        return title

 

 

4、 keyword_case.py:實現:讀取excel表中每行各列數據,通過getattr方法映射對應方法,實現自動化操作:

from util.excel_cell_value import Get_Cells_Value
from keyword_model.actionMethod import ActionMethod
from setting import setting

class KeywordCase(object):
    def __init__(self):
        self.action_metood = ActionMethod()
        excel_default_path = setting.excel_keyword_path
        self.get_cell_value = Get_Cells_Value(excel_default_path)  # 實例化


    def run_main(self):
        get_lines = self.get_cell_value.get_lines  # 獲取行數
        if get_lines:
            for i in  range(1,get_lines):
                is_run = self.get_cell_value.get_is_run(i)
                if is_run == 'yes':
                    carry_method = self.get_cell_value.get_action_method(i)  # 獲取執行方法
                    send_value = self.get_cell_value.get_send_value(i)  # 獲取輸入的數據
                    oper_element = self.get_cell_value.get_oper_element(i)  # 獲取操作的元素
                    expect_result = self.get_cell_value.get_expect_result(i)  # 獲取預期結果
                    real_result = self.get_cell_value.get_real_result(i)  # 獲取實際結果
                    self.run_method(carry_method,send_value,oper_element)  # 執行excel表中對應指定的方法


    def run_method(self,method,send_value = '',handle_value = ''):
        main_method = getattr(self.action_metood,method)
        if send_value == '' and handle_value =='':
            result = main_method()  # 關閉瀏覽器、等待等
        elif send_value == '' and handle_value != '':
            result = main_method(handle_value)  # 打開瀏覽器、訪問url等
        elif send_value != '' and handle_value == '':
            result = main_method(send_value)  # 暫時沒用到
        else:
            result = main_method(send_value,handle_value) # 輸入用戶信息


if __name__ == "__main__":
    keyword_case = KeywordCase()
    keyword_case.run_main()

 

實現自動操作:

  1. 打開瀏覽器
  2. 訪問指定url
  3. 注冊:自動定位→輸入相應用戶信息
  4. 點擊注冊按鈕提交
  5. 等待3秒
  6. 關閉瀏覽器

  


5、關鍵字模型中之獲取測試結果並保存到excel表中

 獲取預期結果,如果預期結果有值則表示需要進行報告填寫。將實際要求結果跟我們獲取到的預期結果做對比,如果匹配成功表示通過(pass),否則表示失敗(fail)

1)因為要將數據寫入excel表中,需要在 excel_cell_value.py 文件中添加一段代碼,用於寫數據到excel表中:

def write_cell_value(self,row,value):
    # 在指定單元格寫入數據
    self.excel_oper.write_value(row,self.report_result,value)



#寫入數據  #excel_operation.py文件
def write_value(self,row,col,value):
    read_value = xlrd.open_workbook(self.excel_path) # 打開excel文件
    write_data = copy(read_value)  # 復制文件,讓xlutils模塊相關操作表
    write_data.get_sheet(0).write(row,col,value)  # 獲取excel表首頁數據,並在row行9列寫入數據
    write_data.save(self.excel_path)   # 保存
    time.sleep(1)

 

2)根據實際要求結果,跟測試時獲取到預測結果,將兩者進行比較,判斷單條case測試是否通過

實際要求結果格式:text=注冊  、  element=password_error 等

預期結果方法:get_title -->獲取網頁title  、  get_element -->獲取定位元素

通過實現預期結果方法,獲取預期結果值,跟實際要求結果進行匹配。

部分代碼:

expect_result_mothod = self.get_cell_value.get_expect_result(i)  # 獲取預期結果方法
real_result_value = self.get_cell_value.get_real_result(i)  # 獲取表中實際要求結果值

if expect_result_mothod != '': # 預期結果有值
    result_value = self.get_real_result_value(real_result_value)
    if result_value[0] == 'text':  # url訪問,獲取網頁title
        result = self.run_method(expect_result_mothod) # expect_result_mothod:driver.get_title()方法
        if result_value[1] in result:  # 判斷實際要求結果值是否存在於實際測試結果中
            self.get_cell_value.write_cell_value(i,'pass') # 在excel表中對應單元格寫入數據
        else:
            self.get_cell_value.write_cell_value(i,'fail')
    elif result_value[0] == 'element': # 獲取元素,判斷輸入格式等
        result = self.run_method(expect_result_mothod,result_value[1]) # expect_result_mothod:get_element()方法,result_value[1]:參數
        if result: # 有值,表示找到對應(如:password_error)錯誤信息,表示格式測試通過(目的就是測試輸入錯誤格式是否會被檢查出來)
            self.get_cell_value.write_cell_value(i,'pass')
        else:
            self.get_cell_value.write_cell_value(i,'fail')
    else:
        print("Error:實際要求結果:{},測試無效".format(real_result_value))
else:
    print('預期結果為空')

def run_method(self,method,send_value = '',handle_value = ''):
    main_method = getattr(self.action_metood,method)
    if send_value == '' and handle_value =='':
        result = main_method()  # 關閉瀏覽器、等待等
    elif send_value == '' and handle_value != '':
        result = main_method(handle_value)  # 打開瀏覽器、訪問url等
    elif send_value != '' and handle_value == '':
        result = main_method(send_value)  # 暫時沒用到
    else:
        result = main_method(send_value,handle_value) # 輸入用戶信息

# 對實際要求結果值進行切分(實際要求結果形似:text=注冊)
def get_real_result_value(self, data):
    return data.split('=')

執行結果:報告一列自動輸入匹配結果

 


 

keyword_case.py完整代碼:

from util.excel_cell_value import Get_Cells_Value
from keyword_model.actionMethod import ActionMethod
from setting import setting

class KeywordCase(object):
    def __init__(self):
        self.action_metood = ActionMethod()
        excel_default_path = setting.excel_keyword_path
        self.get_cell_value = Get_Cells_Value(excel_default_path)  # 實例化


    def run_main(self):
        get_lines = self.get_cell_value.get_lines  # 獲取行數
        if get_lines:
            for i in  range(1,get_lines):
                is_run = self.get_cell_value.get_is_run(i)
                if is_run == 'yes':
                    carry_method = self.get_cell_value.get_action_method(i)  # 獲取執行方法
                    send_value = self.get_cell_value.get_send_value(i)  # 獲取輸入的數據
                    oper_element = self.get_cell_value.get_oper_element(i)  # 獲取操作的元素
                    expect_result_mothod = self.get_cell_value.get_expect_result(i)  # 獲取預期結果
                    real_result_value = self.get_cell_value.get_real_result(i)  # 獲取表中實際要求結果值
                    self.run_method(carry_method,send_value,oper_element)  # 執行excel表中對應指定的方法

                    if expect_result_mothod != '': # 預期結果有值
                        result_value = self.get_real_result_value(real_result_value)
                        if result_value[0] == 'text':  # url訪問,獲取網頁title
                            result = self.run_method(expect_result_mothod) # expect_result_mothod:driver.get_title()方法
                            if result_value[1] in result:  # 判斷實際要求結果值是否存在於實際測試結果中
                                self.get_cell_value.write_cell_value(i,'pass') # 在excel表中對應單元格寫入數據
                            else:
                                self.get_cell_value.write_cell_value(i,'fail')
                        elif result_value[0] == 'element': # 獲取元素,判斷輸入格式等
                            result = self.run_method(expect_result_mothod,result_value[1]) # expect_result_mothod:get_element()方法,result_value[1]:參數
                            if result: # 有值,表示找到對應(如:password_error)錯誤信息,表示格式測試通過(目的就是測試輸入錯誤格式是否會被檢查出來)
                                self.get_cell_value.write_cell_value(i,'pass')
                            else:
                                self.get_cell_value.write_cell_value(i,'fail')
                        else:
                            print("Error:實際要求結果:{},測試無效".format(real_result_value))
                    else:
                        print('預期結果為空')


    def run_method(self,method,send_value = '',handle_value = ''):
        main_method = getattr(self.action_metood,method)
        if send_value == '' and handle_value =='':
            result = main_method()  # 關閉瀏覽器、等待等
        elif send_value == '' and handle_value != '':
            result = main_method(handle_value)  # 打開瀏覽器、訪問url等
        elif send_value != '' and handle_value == '':
            result = main_method(send_value)  # 暫時沒用到
        else:
            result = main_method(send_value,handle_value) # 輸入用戶信息

    # 對實際要求結果值進行切分(實際要求結果形似:text=注冊)
    def get_real_result_value(self, data):
        return data.split('=')


if __name__ == "__main__":
    keyword_case = KeywordCase()
    keyword_case.run_main()

 


免責聲明!

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



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