当Selenium遇到TestNG

2023-10-29

当Selenium遇到TestNG


用 Selenium 测试 Web 页面时,所重现的各种行为依赖于测试人员的输入参数,例如:选择下拉餐单的项目,在文本框中输入字符等。不同的测试用例对应不同的输入,若有方法能够简单 有效的传入测试用参数,会大大提高测试用例的复用性和可维护性。当 Selenium 遇到 TestNG,这些就可以实现。

@Parameters( { "url", "query-string", "btn-id", "txt-id", "verify-String" }) 
@Test 
public void testGoogle(String url, String queryString, String btnID, 
    String txtID, String verifyString) 
{ 
  selenium = new DefaultSelenium("localhost", 4444, "*firefox", url); 
  selenium.start(); 
  selenium.open("/"); 
  selenium.type(txtID, queryString); 
  selenium.click(btnID); 
  selenium.waitForPageToLoad("30000"); 
  verifyTrue(selenium.isTextPresent(verifyString)); 
  selenium.stop(); 
} 
上面的代码清单中,注释 Parameters 指定的参数在 TestNG 测试框架的配置文件 testng.xml 里有具体定义,如下所示:
testng.xml
<parameter name="url" value="http://www.google.cn"></parameter> 

<parameter name="query-string" value="developerworks"></parameter> 

<parameter name="btn-id" value="//input[@name='btnG']"></parameter> 

<parameter name="txt-id" value="//input[@name='q']"></parameter> 

<parameter name="verify-String" value="developerWorks 中国"></parameter>

只要修改 testng.xml 中的参数值,就能由输入参数驱动不同的测试用例。然而,仅仅在 testng.xml 中指定参数有很大的局限性,显然过多的参数会难以维护,
无法井井有条地组织分属不同 Test Cases 的输入。在下文中,我们来解决这个问题。

基于 Selenium 的分层测试框架

Test Suite 包含三类 Test Cases(谷歌百度与必应),每类 Test Cases 的一个 Test Case 由若干可复用的 Test Tasks 组成,通过传入不同的参数,Test Task 完成同质的不同行为。在 Test Task 之下,定义相关文件,包含待测试的 Web 页面元素的定位信息。因此,分层 Selenium 框架有三个层次:

appObjects —— Web 页面元素定位信息,如按钮与文本框等;

  tasks ——测试步骤中可复用的行为;

  test cases ——由 tasks 组成的测试用例。

  Web 元素 locators 定义与收集

  Selenium 根据 XPath 来定位 Web 元素,XPath 的相关知识不属于本文的内容。前面例子中,在 TestNG 的配置文件 testng.xml 里定义文本框与按钮的 locators,对于复杂的测试场景而言,这不是好的实践。因此,我们在 appObjects 层建立文件,将 Web 页面元素 locators 归入,便于维护使用。Selenium-IDE 的 Find 功能适于完成这一步骤。文件 googlePages.properties 的内容如下:

清单 7. locators 文件示例

#define the keys and corresponding XPaht locators of google page. 
googleSearchTxtField=//input[@name='q'] 
googleSearchBtn=//input[@name='btnG'] 

  这时,在 testng.xml 中,删去 locators 相关的 parameters,只需要解析 .properties 文件,生成 locators 的 properties 备用。在所附的源码中可以看到 .properties 文件的解析器 PropUtils 的简单实现。

  测试任务分解与实现

  为说明任务分解,以简单的搜索过程为例,可以分为输入搜索关键字、点击搜索按钮、以及验证结果页面。实际代码如下所 示,不难发现,由参数决定行为方式的测试任务,都接受一个 paraMap 数据结构,并根据其内容在方法内采取适当的行为。通过这种方式,test cases 能够以参数配置文件来驱动测试任务实施其想要的行为。

清单 8. Test Task 代码示例

public void openSite() { 
  selenium.open("/"); 
} 
 
public void typeSearchTxtField(HashMap<String, Object> paraMap) 
{ 
  utils.waitForElement((String) elemMap 
    .get(TestGoogleConstants.GOOGLE_SEARCH_TXT_FIELD), 30); 
  selenium.type((String) paraMap 
    .get(TestGoogleConstants.GOOGLE_SEARCH_TXT_FIELD), 
    (String) elemMap 
    .get(TestGoogleConstants.GOOGLE_SEARCH_TXT_FIELD)); 
 } 
 
public void clickSearchBtn() { 
  utils.waitForElement((String) 
  elemMap.get(TestGoogleConstants.GOOGLE_SEARCH_BTN), 30); 
  selenium.click((String) elemMap.get(TestGoogleConstants.GOOGLE_SEARCH_BTN)); 
} 
 
public void verifyResult(HashMap<String, Object> paraMap){ 
  stc.verifyTrue(selenium.isTextPresent((String) 
    paraMap.get(TestGoogleConstants.VERIFY_STRING))); 
} 

  clickSearchBtn 方法无需参数输入,因为其任务只是点击搜索按钮,在 test cases 需要时调用即可。这里只是以一个简单的例子说明如何分解任务,对于实际的 test case,这个过程会复杂许多,但其后的复用与灵活调用完全值得这些工作的付出。

  Test Cases 实现与 Test Tasks 调用

  Test Cases 作为一系列测试步骤的集合,可以通过调用若干 Test Tasks 实现。以贯穿本文的搜索引擎为例,以此调用上一部分定义的 test taskss,重现整个测试过程。简单代码如下所示。

清单 9. Test Case 代码示例

@Parameters( { "google_se_para_1" }) 
@Test 
public void testGoogle_1(String paraFile) 
{ 
  paraMap = (HashMap<String, Object>) XMLParser.getInstance() 
    .parserXml(paraFile); 
  tgTasks.openSite(); 
  tgTasks.typeSearchTxtField(paraMap); 
  tgTasks.clickSearchBtn(); 
  tgTasks.verifyResult(paraMap); 
} 

Test Cases 在分层 Selenium 测试框架下,就是按照要求调用已有的 Test Tasks。值得注意的是,在上面两个代码列表里的 paraMap 参数。这个哈希表由我们实现的解析器解析参数定义文件而得到。TestNG 的 Parameters 参数机制,使得 Test Cases 能够灵活地指定参数文件,从而驱动不同的 Test Cases。

清单 10. 参数定义文件示例

<?xml version="1.0" encoding="UTF-8"?> 
<fvt_element> 
  <!-- Search String--> 
  <arg id="googleSearchTxtField"> 
    <value>developerworks</value> 
  </arg> 
  <arg id="verify-String"> 
    <value>developerWorks 中国 </value> 
  </arg> 
</fvt_element> 


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当Selenium遇到TestNG 的相关文章

  • 软件测试开发/全日制/测试管理丨用户端 App 自动化测试

    随着移动应用的普及和发展 用户端 App 自动化测试成为确保应用质量 提高测试效率的关键环节 这一测试方法不仅可以模拟用户真实的操作行为 还能够覆盖多种设备和平台 为移动应用的稳定性和用户体验提供可靠的保障 选择合适的自动化测试框架 在用户
  • 软件测试开发/全日制/测试管理丨性能测试

    性能测试是软件测试中的一项重要活动 旨在评估系统在不同条件下的性能 稳定性和可伸缩性 通过模拟实际用户负载 性能测试有助于发现潜在的性能瓶颈和优化空间 确保系统能够在各种情况下高效运行 性能测试的主要类型 负载测试 通过逐渐增加用户负载 测
  • 【软件测试】学习笔记-脚本与数据的解耦 + Page Object模型

    本篇文章介绍GUI测试中两个非常重要的概念 测试脚本和数据的解耦 以及页面对象 Page Object 模型 测试脚本和数据的解耦 GUI自动化测试适用的场景 尤其适用于需要回归测试页面功能的场景 如果在测试脚本中硬编码 hardcode
  • 小白也能学会的创建Git仓库实操

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 2k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 软件测试/测试开发/全日制/测试管理丨Python关键字

    Python 语言有一些关键字 它们具有特殊的含义 不能被用作标识符 变量名 函数名等 False 布尔类型的假值 None 表示一个空对象或无值 True 布尔类型的真值 and 逻辑与操作符 as 用于给导入的模块起别名 assert
  • 2种方法,教你使用Python实现接口自动化中的参数关联

    通常在接口自动化中 经常会参数关联的问题 那么什么是参数关联 参数关联就是上一个接口的返回值会被下一个接口当做参数运用 其中Python中可以实现参数关联的方法有很多种 今天小编给大家介绍下 如何通过Python来实现接口自动化中的参数关联
  • 测试开发必知:有Tomcat,为什么还要Nginx?

    只用Tomcat 不用Nginx搭建Web服务 行不行 我曾经提出的愚蠢问题 今天详细给自己解释下 为什么必须用Nginx 不用Nginx 只用Tomcat的Http请求流程 浏览器处理一个Http请求时 会首先通过DNS服务器找到域名关联
  • 软件测试|web自动化测试神器playwright教程(三十八)

    简介 在我们使用selenium时 我们可以获取元素的属性 元素的文本值 以及输入框的内容等 作为比selenium更为强大的web自动化测试神器 playwright也可以实现对元素属性 文本值和输入框内容的抓取 并且实现比seleniu
  • 软件测试|Pydantic处理时间类型数据

    简介 我们之前介绍过使用 pydantic 验证数据 比如校验数据的格式等 但是在我们的日常工作中 还有一种数据是需要我们验证的 比如时间数据 时间数据不同于字符串 列表等数据 与他们的验证不一样 本文就来为大家介绍一下 pydantic
  • 软件测试|使用Python读写yaml文件,你会了吗?

    简介 YAML YAML Ain t Markup Language 是一种可读的数据序列化格式 它常用于配置文件和数据交换 Python 提供了许多库来处理 YAML 文件 在本文中 我们将探讨如何使用 PyYAML 库来读取和写入 YA
  • 软件测试|教你如何使用Python绘制出奥运五环旗

    简介 我们之前介绍过使用turtle来绘制正多边形 但是绘制正多边形只是turtle模块最基础的使用 我们可以使用turtle模块绘制出更多不一样的精彩图形 本文就来给大家介绍一个比较简单的turtle绘图实例 绘制奥运五环旗 初始化参数
  • 软件测试|教你使用Python下载图片

    前言 我一直觉得Windows系统默认的桌面背景不好看 但是自己又没有好的资源可以进行替换 突然我一个朋友提醒了我 网络上的图片这么多 你甚至可以每天换很多个好看的背景 但是如果让我手动去设置的话 我觉得太麻烦了 我不如使用技术手段将图片下
  • 软件测试|如何使用selenium处理iframe富文本输入框

    简介 在网页开发中 富文本框是常见的元素 用于输入富文本内容 如富文本编辑器或邮件编辑器 如果我们要使用Python和Selenium进行自动化测试或操作这种富文本框 可能会遇到一些挑战 本文将详细介绍如何使用Python和Selenium
  • 新手也能看懂的【前端自动化测试入门】

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 甜蜜而简洁 —— 深入了解Pytest插件pytest-sugar

    在日常的软件开发中 测试是确保代码质量的关键步骤之一 然而 对于测试报告的生成和测试结果的可读性 一直以来都是开发者关注的焦点 Pytest插件 pytest sugar 以其清晰而美观的输出 为我们提供了一种愉悦的测试体验 本文将深入介绍
  • Python常用的自动化小脚本!

    一 list转json string转json 可以使用Python内置的 json 模块将列表 List 和字符串 String 转换成JSON格式 List转JSON假设我们有一个列表 List my list apple banana
  • 做测试不会 SQL?超详细的 SQL 查询语法教程来啦!

    前言 作为一名测试工程师 工作中在对测试结果进行数据比对的时候 或多或少要和数据库打交道的 要和数据库打交道 那么一些常用的sql查询语法必须要掌握 最近有部分做测试小伙伴表示sql查询不太会 问我有没有sql查询语法这一块的文档可以学习
  • 程序员找工作难!拿到外包公司的 offer 我应该去么?

    引言 前一阵子有一个帖子引起了非常广泛的讨论 描述的就是一个公司的外包工作人员 加班的时候因为吃了公司给员工准备的零食 被公司的HR当场批评 这个帖子一发出来 让现在测试行业日益新增的外包公司备受关注 那么外包公司和非外包公司有什么样的不一
  • Web自动化测试 —— cookie复用

    一 cookie简介 cookie是一些数据 存储于用户电脑的文本文件中 当web服务器想浏览器发送web页面时 在链接关闭后 服务端不会记录用户信息 二 为什么要使用Cookie自动化登录 复用浏览器仍然在每次用例开始都需要人为介入 若用
  • UI自动化测试之Jenkins配置

    背景 团队下半年的目标之一是实现自动化测试 这里要吐槽一下 之前开发的测试平台了 最初的目的是用来做接口自动化测试和性能测试 但由于各种原因 接口自动化测试那部分功能整个废弃掉了 其中和易用性有很大关系 另外 也和我们公司的接口业务也有关

随机推荐

  • 区块链-密码学与安全技术

    密码学与安全技术 工程领域从来没有黑科技 密码学不仅是工程 密码学相关的安全技术在整个信息技术领域的重要地位无需多言 如果没有现代密码学和信息安全的研究成果 人类社会根本无法进入信息时代 区块链技术大量依赖了密码学和安全技术的研究成果 实际
  • C++基础知识 - 函数返回引用深度解析

    函数返回引用深度解析 C 引用使用时的难点 当函数返回值为引用时 若返回局部变量 不能成为其它引用的初始值 不能作为左值使用 返回静态变量 或 全局变量的引用 可成为其他引用的初始值 也可以作为左值 也可作为右值 返回函数的普通形参作为引用
  • Basic Level 1019 数字黑洞 (20分)

    题目 给定任一个各位数字不完全相同的 4 位正整数 如果我们先把 4 个数字按非递增排序 再按非递减排序 然后用第 1 个数字减第 2 个数字 将得到一个新的数字 一直重复这样做 我们很快会停在有 数字黑洞 之称的 6174 这个神奇的数字
  • Java实现微信小程序获取unionID

    前言 微信开发平台为开发者提供openId用来区分用户的唯一性 但是openId只是在独立的应用内是唯一的 如果开发者拥有多个移动应用 网站应用 和公众帐号 包括小程序 可通过 UnionID 来区分用户的唯一性 因为只要是同一个微信开放平
  • linux监控php脚本执行时间,在LINUX环境下定时执行php脚本

    1 使用Crontab定时执行linux环境下的php脚本文件 Cron 它是一个linux下的定时执行工具 根用户以外的用户可以使用 crontab 工具来配置 cron 任务 所有用户定义的 crontab 都被保存在 var spoo
  • springboot+vue实现ChatGPT逐字输出打字效果

    文章目录 前言 一 效果 二 Springboot后端 1 封装请求OpenAI接口的客户端 2 对话处理 3 对话请求接口 二 Vue前端 前言 在调用OpenAI GPT接口时 如果不使用流式 stream true 参数 接口会等待所
  • Centos7安装mysql遇到的问题

    使用yum y install mysql community server安装mysql时候提示 The GPG keys listed for the MySQL 5 7 Community Server repository are
  • AIX 下磁盘 I/O 性能分析

    转自 http www ibm com developerworks cn aix library 1203 weixy aixio 磁盘 I O 的概念 I O 的概念 从字义来理解就是输入输出 操作系统从上层到底层 各个层次之间均存在
  • 【SpringBoot】整合Kafka集群

    学习笔记 一 环境 二 maven引入 三 application配置 四 SpringBoot 生产者 五 SpringBoot 消费者 六 SpringBoot 主题分区 一 环境 使用Kafka3 0 0 master slave1
  • 解决mac中idea无法引入servlet-api包的问题

    1 虽然在pom文件中已经引入servlet api的依赖 如下
  • 14. 线性代数 - 线性方程组

    文章目录 线性方程组 矩阵 行列式 全排列和逆序数 N阶行列式 非 齐次线性方程 Hi 大家好 我是茶桁 结束了 微积分 部分的学习之后我们稍作休整 今天正式开始另外一部分 线性代数 的学习 小伙伴们放松完回来要开始紧张起来了 我们之前说过
  • Unity的C#编程教程_64_对象池 Object Pooling 详解及应用练习

    文章目录 Object Pooling Design Pattern Challenge Pool Manager Challenge Request from Pool Manager Recycle the Pool Object Po
  • QT 发布软件基本操作

    一 配置环境变量 找到Qt安装时的bin目录的路径 D Qt Qt5 14 2 5 14 2 mingw73 64 bin 将目录拷贝至下述环境变量中 打开计算机的高级系统设置 选中环境变量 gt 系统变量 gt Path 点击编辑 gt
  • javascript 将数组转换为字符串方法总结

    1 String arr 输出数组的每个元素值 用逗号分隔 2 arr join 分隔符 输出数组的每个元素之 用指定的分隔符分隔
  • 循环队列的实现(初始化、入队操作、出队操作、判满、判空、获取队头、队尾元素、销毁操作)

    typedef struct int array int front int rear int count 用count 的方式判断循环队列是否满 int N 总个数 MyCircularQueue 初始化 MyCircularQueue
  • 宝塔面板最全最快搭建https访问网站终极版教程

    我的个人博客 网址 https www minikuba com 迷你酷吧是一个基于程序员经验为基础分享技术文章 算法解题 大厂面试真题 热门项目的平台 致力于为大家提供更多涵盖前后端技术 技能的学习 助力广大热衷编程开发者全面发展 本文章
  • 动态集合和静态集合的不同

    ul li 1 li li 2 li li 3 li li 4 li li 5 li li 6 li ul
  • 铰接式车辆的横向动力学仿真提供车辆模型研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 铰接式车辆是一种具有铰接连接的多体系统 具
  • 【乌拉喵.教程】不同负载下继电器的保护电路设计(解决继电器触点粘接的问题)

    最近将多年来收集到的教学视频 国内外图书 源码等整理整合拿出来 涉及arm Linux python 信号完整性 FPFA DSP 算法 stm32 单片机 制图 电子模块 kali 出版社图书等 资料目前约1 5TB 详情 1 5TB 电
  • 当Selenium遇到TestNG

    当Selenium遇到TestNG 用 Selenium 测试 Web 页面时 所重现的各种行为依赖于测试人员的输入参数 例如 选择下拉餐单的项目 在文本框中输入字符等 不同的测试用例对应不同的输入 若有方法能够简单 有效的传入测试用参数