• Web自动化测试:selenium如何实现关键字驱动(超详细)


    前言

    要做 ui 自动化测试,使用关键字驱动可以说是必须会的一种测试方式,它既可以在纯代码的自动化程序中运行,也可以在测试平台中使用。

    使用纯代码方式时,自动化工程师先写好一个通用的程序,其他手工测试人员只需要把执行的页面操作关键字填入到一个表格当中,就可以执行自动化测试了。这个表格可以是 Excel 表格,也可是 yaml 文件。

    使用测试平台时,测试开发工程会编写一个界面,在假面中,手工测试人员也可以选择需要操作的页面关键字,选择完以后就可以执行自动化测试了。

    关键字驱动实现成本低,操作起来也方便,真是个做 ui 自动化测试的好方式。本文介绍一种简单的关键字驱动实现方式,不需要很高深的编程知识也能掌握。

    关键字驱动实现主要分为三个部分:

    • 关键字方法的定义,其实就是页面的通用操作,比如点击、输入等常见操作,由自动化测试工程师编写。
    • 关键字表格配置。谁编写自动化用例,谁配置这个表格,它主要定义用例需要执行的页面操作和测试数据,最好通过脚本自动生成固定格式的文件,并且把可以选择的操作名称说明,方便使用, 在测试平台中,可以通过下拉框搜索和选择的方式选择,会更加方便。
    • 调用关键字,执行页面操作。这个也是由自动化测试工程师编写,读取 yaml 文件中的页面操作,并且执行。

    同时,我也准备了一份软件测试面试视频教程(含接口、自动化、性能等),需要的可以直接在下方观看,或者直接关注VX公众号:互联网杂货铺,免费领取

    软件测试视频教程观看处:

    字节大佬教你逼自己如何在15天内掌握自动化测试(接口自动化/APP自动化/Web自动化/性能测试),内含项目实战

    定义关键字方法

    如果要对 web 网页进行自动化测试,我们可以定义 Page 类,封装点击、输入等页面操作。

    1. # keywords.py
    2. from selenium.webdriver.remote.webdriver import WebDriver
    3. from selenium.webdriver.remote.webelement import WebElement
    4. from selenium.webdriver.support import expected_conditions
    5. from selenium.webdriver.support.wait import WebDriverWait
    6. DEFAULT_TIMEOUT = 8
    7. class Page:
    8. def __init__(self, driver: WebDriver):
    9. self.driver = driver
    10. def goto(self, url):
    11. """页面访问"""
    12. self.driver.get(url)
    13. def wait_clickable(self, locator, timeout=None) -> WebElement:
    14. timeout = DEFAULT_TIMEOUT if timeout is None else timeout
    15. wait = WebDriverWait(self.driver, timeout=timeout)
    16. return wait.until(expected_conditions.element_to_be_clickable(locator))
    17. def wait_visible(self, locator, timeout=None) -> WebElement:
    18. timeout = DEFAULT_TIMEOUT if timeout is None else timeout
    19. wait = WebDriverWait(self.driver, timeout=timeout)
    20. return wait.until(expected_conditions.visibility_of_element_located(locator))
    21. def click(self, locator):
    22. """页面点击"""
    23. el = self.wait_clickable(locator)
    24. el.location_once_scrolled_into_view
    25. el.click()
    26. def fill(self, locator, words):
    27. """页面输入"""
    28. el = self.wait_visible(locator)
    29. el.send_keys(words)

    关键字表格

    关键字表格是一个自动化用例的测试步骤和数据,这里我们使用 yaml 文件,action 表示要使用的页面操作,它对应前面 Page 类中的同名方法, params 表示方法需要传入的测试参数。

    每个不同的用例,编写一个 yaml 文件,当需要运行自动化测试时,把 yaml 文件作为参数传入自动化程序中就可以了。

    1. # login.yaml
    2. -
    3. action: goto
    4. params:
    5. url: "https://petstore.octoperf.com/actions/Account.action?signonForm="
    6. -
    7. action: fill
    8. params:
    9. locator: ['name', 'username']
    10. words: 'yuze'
    11. -
    12. action: fill
    13. params:
    14. locator: ['name', 'password']
    15. words: '1234'
    16. -
    17. action: click
    18. params:
    19. locator: ['name', 'signon']

    使用关键字操作浏览器

    最后是通用的测试用例编写。定义一个 test_keyword 函数, 首先读取 login.yaml 文件中的测试步骤和数据,使用 getattr 方法, 把需要调用的页面操作名称 goto, fill, click 传入,获取 Page 类中的同名方法,调用这些方法就能实现对应的自动化操作。

    这些代码大多数不需要进行额外修改,当需要运行不同的测试用例,只需要修改 yaml 文件的名称,调用不同的 yaml 测试步骤。

    1. # test_login.py
    2. import yaml
    3. import pytest
    4. from selenium import webdriver
    5. from keyworks import Page
    6. @pytest.fixture
    7. def driver():
    8. d = webdriver.Chrome()
    9. d.implicitly_wait(8)
    10. d.maximize_window()
    11. yield d
    12. d.quit()
    13. def test_keyword(driver):
    14. """获取 yaml 文件"""
    15. with open('signin.yaml', encoding='utf-8') as f:
    16. steps = yaml.safe_load(f)
    17. page = Page(driver)
    18. for step in steps:
    19. action_name = step.get('action')
    20. params = step.get('params')
    21. action = getattr(page, action_name)
    22. action(**params)

    运行

    现在,我们只需要定义不同的 yaml 文件,然后使用 pytest 这样的测试框架来运行自动化用例就可以。 但是,作为一个简单版关键字驱动实现方式,这个程序还有很多的优化空间。

    比如,现在编写多个 yaml 文件后,还需要创建多个 python 的 test 文件。而更加常见的方式是,可以通过命令行配置一个 yaml 文件,我就可以运行该 yaml 文件的测试步骤。

    配置多个 yaml 文件,就可以运行多个 yaml 文件的测试步骤。甚至可以配置文件夹名称,就运行文件夹下所有的 yaml 文件的测试步骤。

    yaml 文件的生成也可以通过命令行生成。

    这个我们在后面在实现,目前来说,我们至少已经知道关键字驱动的实现方式了。

    PS:如需要软件测试学习资料,可在公众号(互联网杂货铺),后台回复1,小编后面会逐步完善自己收藏的资料。

    整理不易,给个关注点个赞吧,谢谢各位大佬!

  • 相关阅读:
    从Spring中学到的【1】--读懂继承链
    【Git】Git常用操作命令大全(笔记)
    redis命令行操作库、键、和五大数据类型详解
    springboot与redis
    基于Python的语音识别系统
    java计算机毕业设计社区健康信息管理系统源码+系统+mysql数据库+lw文档
    pdf添加书签的软件,分享3个实用的软件!
    Redis集群
    ssm人事管理系统
    比较好用的服务器和网站在线测速工具分享
  • 原文地址:https://blog.csdn.net/cs888zsy/article/details/132856173