• UI自动化之关键字驱动


    关键字驱动框架:将每一条测试用例分成四个不同的部分

    • 测试步骤(Test Step):一个测试步骤的描述或者是测试对象的一个操作说明
    • 测试步骤中的对象(Test Object):指页面的对象或者元素
    • 对象执行的动作(Action):页面操作的动作
    • 执行对象所需要的数据(Test Data):任何对象操作时所需要的值

    例如:登录163邮箱,步骤分为:

    1. 打开浏览器
    2. 输入url
    3. 切换iframe
    4. 输入用户名
    5. 输入密码
    6. 点击登录

    1:创建excel文件,使用excel文件来存放测试用例及测试步骤,excel内容如下:

    login的sheet页中,描述了测试步骤,测试步骤中的对象可以分为:测试对象的定位方式以及定位方式表达值:

    从excel文件中,可以看到,每一个步骤我们要执行的动作是什么,例如打开浏览器,我们需要定义一个open_browse方法,再读取excel文件的内容时,程序才知道要怎么做。因此我们需要为每个执行动作定义一个方法。

    再在excel中增加一个sheet页,从来存放测试用例,如index:

    2:搭建项目框架,只是简单的实现关键字驱动,需要的其他内容可以再往框架中加。

    项目结构目录:

    3:接下来我们来看一下各个文件夹下py文件的内容

    首先是Util文件夹下,封装的查找元素控件的工具类find_ele.py文件

    1. # find_ele.py
    2. from selenium.webdriver.support.wait import WebDriverWait
    3. def find_element(driver, location_type, location_express):
    4. '''查找控件元素'''
    5. try:
    6. driver = WebDriverWait(driver, 20).until(lambda driver:driver.find_element(location_type, location_express))
    7. return driver
    8. except Exception as e:
    9. raise e

    接下来我们就要在Util文件下,封装读取excel文件内容方法的excel_parse.py文件,再封装该方法前,需要在Setting文件下,创建Config.py文件,用来获取文件路径。

    Config.py文件内容如下:

    1. # Config.py
    2. import os
    3. Base_Dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    4. # 测试数据文件
    5. Test_Data_Path = os.path.join(Base_Dir, 'TestData')

    excel_parse.py文件内容如下:

    1. # excel_parse.py
    2. from Setting.Config import Test_Data_Path
    3. from openpyxl import load_workbook
    4. class ExcelParse:
    5. def __init__(self):
    6. self.workbook = None
    7. self.sheet = None
    8. def load_workbook(self, filename):
    9. '''加载文件'''
    10. try:
    11. self.workbook = load_workbook(filename)
    12. except Exception as e:
    13. raise e
    14. def get_sheet(self, sheetname):
    15. '''获取sheet页'''
    16. try:
    17. self.sheet = self.workbook[sheetname]
    18. except Exception as e:
    19. raise e
    20. def get_row_num(self):
    21. '''返回行数'''
    22. return self.sheet.max_row
    23. def get_col_num(self):
    24. '''返回列数'''
    25. return self.sheet.max_column
    26. def get_cell_value(self, row, col):
    27. '''返回某一单元格的值'''
    28. return self.sheet.cell(row=row, column=col).value
    29. def get_row_value(self, row):
    30. '''返回某一行的值'''
    31. try:
    32. col = self.get_col_num()
    33. data = []
    34. for i in range(1, col+1):
    35. data.append(self.get_cell_value(row, i))
    36. return data
    37. except Exception as e:
    38. raise e
    39. def write_cell(self, row, col, filename, content):
    40. '''单元格赋值'''
    41. try:
    42. self.sheet.cell(row=row, column=col, value=content)
    43. self.workbook.save(filename)
    44. except Exception as e:
    45. raise e
    46. if __name__ == '__main__':
    47. execl = ExcelParse()
    48. execl.load_workbook(Test_Data_Path + '/login.xlsx')
    49. execl.get_sheet('login')
    50. res = execl.get_row_value(2)
    51. print(res)

    然后就需要定义测试步骤中的执行动作的方法,在Util文件夹下,创建elementAction.py文件,内容如下:

    1. # elementAction.py
    2. from selenium import webdriver
    3. from Util.find_ele import find_element
    4. driver = None
    5. def open_browse(browser_name, *args):
    6. '''打开浏览器'''
    7. global driver
    8. try:
    9. if browser_name.lower() == 'chrome':
    10. driver = webdriver.Chrome()
    11. elif browser_name.lower() == 'firefox':
    12. driver = webdriver.Firefox()
    13. else:
    14. driver = webdriver.Ie()
    15. except Exception as e:
    16. raise e
    17. def get_url(url, *args):
    18. '''打开网址'''
    19. try:
    20. driver.get(url)
    21. except Exception as e:
    22. raise e
    23. def max_window(*args):
    24. '''窗口最大化'''
    25. try:
    26. driver.maximize_window()
    27. except Exception as e:
    28. raise e
    29. def switch_frame(location_type, location_express, *args):
    30. '''切换iframe'''
    31. try:
    32. frame = find_element(driver, location_type, location_express)
    33. driver.switch_to.frame(frame)
    34. except Exception as e:
    35. raise e
    36. def input_content(location_type, location_express, content, *args):
    37. '''定位输入框,输入内容'''
    38. try:
    39. find_element(driver, location_type, location_express).send_keys(content)
    40. except Exception as e:
    41. raise e
    42. def click(location_type, location_express, *args):
    43. '''点击操作'''
    44. try:
    45. find_element(driver, location_type, location_express).click()
    46. except Exception as e:
    47. raise e
    48. def assert_title(title, *args):
    49. '''断言title是否正确'''
    50. try:
    51. assert title in driver.title
    52. except Exception as e:
    53. raise e
    54. def close_browse():
    55. '''关闭浏览器'''
    56. driver.quit()
    57. if __name__ == '__main__':
    58. open_browse('chrome')
    59. get_url('http://mail.163.com')
    60. max_window()
    61. switch_frame('tag name', 'iframe')
    62. input_content('name', 'email', 'test123')
    63. input_content('name', 'password', 'a123456')
    64. click('id', 'dologin')
    65. assert_title('网易')

    然后将从excel文件中读取出来的内容,拼接成要执行的方法。在Util文件夹下,创建common.py文件。

    1. # common.py
    2. def generate_method_express(location_type, location_express, key_word, operate_data):
    3. # location_type, location_express为空,operate_data不为空
    4. if key_word and operate_data and location_type is None and location_express is None:
    5. # 判断操作值的类型
    6. if isinstance(operate_data, int):
    7. method_express = key_word + '(' + str(operate_data) + ')'
    8. else:
    9. method_express = key_word + "('" + operate_data + "')"
    10. # print(method_express)
    11. # 只有关键字有值,其他的都为空,比如:max_window, close_browse
    12. elif key_word and operate_data is None and location_type is None and location_express is None:
    13. method_express = key_word + '()'
    14. # print(method_express)
    15. # location_type,location_express不为空,operate_data为空
    16. elif key_word and location_type and location_express and operate_data is None:
    17. method_express = key_word + "('" + location_type + "','" + location_express + "')"
    18. # print(method_express)
    19. # 都不为空
    20. else:
    21. if isinstance(operate_data, int):
    22. method_express = key_word + "('" + location_type + "','" + location_express + "'," + str(operate_data) + ")"
    23. else:
    24. method_express = key_word + "('" + location_type + "','" + location_express + "','" + operate_data + "')"
    25. print(method_express)
    26. return method_express

    之后,就是编写执行测试用例了。

    在TestScript文件夹下,创建test_login.py文件

    1. # test_login.py
    2. from Util.excel_parse import ExcelParse
    3. from Setting.Config import Test_Data_Path
    4. from Util.elementAction import *
    5. from Util.common import generate_method_express
    6. excel = ExcelParse()
    7. # 加载login.xlsx文件
    8. excel.load_workbook(Test_Data_Path + '/login.xlsx')
    9. def test_run():
    10. try:
    11. # 获取indexsheet页
    12. excel.get_sheet('index')
    13. # 获取index的行数
    14. rows = excel.get_row_num()
    15. for i in range(2, rows+1):
    16. # 判断是否要执行
    17. is_run = excel.get_cell_value(i, 4).lower()
    18. if is_run == 'y':
    19. # 获取要执行的sheet页名称
    20. case_step_sheet = excel.get_cell_value(i, 3)
    21. # 切换到要执行的sheet页
    22. excel.get_sheet(case_step_sheet)
    23. # 获取要执行的步骤数
    24. step_num = excel.get_row_num()
    25. # print(step_num)
    26. success_num = 0 # 记录成功的步骤数
    27. for j in range(2, step_num+1):
    28. # 获取步骤描述
    29. step_desc = excel.get_cell_value(j, 1)
    30. # 定位方式
    31. location_type = excel.get_cell_value(j, 2)
    32. # 定位方式表达值
    33. location_express = excel.get_cell_value(j, 3)
    34. # 执行动作
    35. key_word = excel.get_cell_value(j, 4)
    36. # 执行数据
    37. operate_data = excel.get_cell_value(j, 5)
    38. # print(step_desc, location_type, location_express,key_word, operate_data)
    39. method_express = generate_method_express(location_type, location_express, key_word, operate_data)
    40. try:
    41. # 运行函数,eval(),将字符串str当成有效的表达式来求值并返回计算结果
    42. eval(method_express)
    43. except Exception as e:
    44. raise e
    45. else:
    46. success_num += 1
    47. # 切换sheet页到index
    48. excel.get_sheet('index')
    49. if success_num == step_num - 1:
    50. # 成功的步骤数等于步骤sheet页的行数减1,表示测试执行成功,写入成功
    51. excel.write_cell(i, 5, Test_Data_Path + '/login.xlsx', 'pass')
    52. else:
    53. # 写入失败
    54. excel.write_cell(i, 5, Test_Data_Path + '/login.xlsx', 'Fall')
    55. except Exception as e:
    56. raise

    执行test_login.py文件,关键字驱动就实现了。这只是简单的实现了关键字驱动,了解了关键字驱动应该是什么样的,日志、测试报告、执行入口可以自己再添加,上面的代码也可以再进行优化。

  • 相关阅读:
    20.项目开发之量化交易QuantTrade(二)
    那些你不得不知道的CSS知识点
    Flutter自定义输入框同时出现多种字体颜色
    【Vue】ref,reactive 响应式引用的用法和原理(1)
    Linux/CentOS 安装 flutter 与 jenkins 构建 (踩坑)
    Python:处理XML文件汇总
    HAC集群修改管理员用户密码
    讨论面向对象及方法学的特点?为什么要用面向对象方法开发软件?
    【云原生】微服务SpringCloud-eureka(server)集群搭建
    车载摄像头CAM
  • 原文地址:https://blog.csdn.net/weixin_48323589/article/details/132631783