当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 的相关文章

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

    随着Web应用的普及和不断发展 用户端Web自动化测试成为确保Web应用质量的重要手段 这种测试方法不仅提高了测试效率 也帮助团队及时发现和解决潜在问题 确保用户体验的连贯性和稳定性 工具选择 用户端Web自动化测试的第一步是选择适当的工具
  • 软件测试|好用的pycharm插件推荐(五)——Translation

    前言 在我们的日常工作中 经常会遇到需要查看各个第三方库源码的问题 在很多情况下 我们的英语能力不能够满足我们完全读懂源码 所以我们就需要借助翻译工具来帮助我们理解第三方库的源码 如果我们将源码复制再使用其他工具翻译 会显得比较繁琐 如果有
  • 软件测试|Windows系统配置pytest+allure环境教程

    前言 allure可以输出非常精美的测试报告 也可以和pytest进行完美结合 不仅可以渲染页面 还可以控制用例的执行 本文我们将介绍Windows系统中如何配置allure环境 第一步 配置Java环境 因为 allure 的运行依赖于J
  • JMeter 批量接口测试

    一 背景 最近在进行某中台的接口测试准备 发现接口数量非常多 有6 70个 而且每个接口都有大量的参数并且需要进行各种参数验证来测试接口是否能够正确返回响应值 想了几种方案后 决定尝试使用JMeter的csv读取来实现批量的接口测试 二 脚
  • 软件测试|Python openpyxl库使用指南

    简介 我们之前介绍过 python在自动化办公方面可以大放异彩 因为Python有许多的第三方库 其中有很多库就支持我们对office软件进行操作 熟练的使用Python对office进行操作 可以实现自动化办公 极大提升我们的工作效率 本
  • #私密朋友圈被吐槽有bug?官方致歉!网友:尴尬了......

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 2k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • Locust负载测试工具实操

    本中介绍如何使用Locust为开发的服务 网站执行负载测试 Locust 是一个开源负载测试工具 可以通过 Python 代码构造来定义用户行为 避免混乱的 UI 和臃肿的 XML 配置 步骤 设置Locust 在简单的 HTTP 服务上模
  • Jenkins 插件下载速度慢、安装失败了!我教你怎么解决!

    Jenkins部署完毕 如果不安装插件的话 那它就是一个光杆司令 啥事也做不了 所以首先要登陆管理员账号然后点击系统管理再点击右边的插件管理安装CI CD必要插件 但是问题来了 jenkins下载插件速度非常慢 而且经常提示下载插件失败 真
  • 步骤详图 教你在linux搭建容器环境

    警告 切勿在没有配置 Docker YUM 源的情况下直接使用 yum 命令安装 Docker 1 准备工作 系统要求 要安装Docker CE 社区版 操作系统的最低要求是CentOS7 7以下版本都不被支持 卸载旧版本 Docker改版
  • 测试用例评审流程优化

    测试用例 评审是QA日常工作流程中的关键一环 是QA同学完善测试用例 交流测试经验的好机会 负责组内测试用例建设以来 作者对于评审流程做了一些优化工作 本文作者将整个优化过程中的心得体会做了一个总结 希望能给大家带来帮助 01 原始流程 1
  • 软件测试|使用matplotlib绘制多种折线图

    简介 在数据可视化领域 Matplotlib是一款非常强大的Python库 它可以用于绘制各种类型的图表 包括折线图 本文将介绍如何使用Matplotlib创建多种不同类型的折线图 并提供示例代码 创建模版 在绘图之前 我们可以先创建我们的
  • 软件测试|使用Python读写yaml文件,你会了吗?

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

    简介 在数据可视化领域 Matplotlib是一款强大的Python库 它可以用于创建多种类型的图表 包括柱状图 本文将介绍如何使用Matplotlib创建多种不同类型的柱状图 并提供示例代码 创建基本柱状图 首先 让我们创建一个基本的柱状
  • msyql 异常,别干着急,70%的问题都在这里!

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 月薪2W的软件测试工程师,到底是做什么的?

    在生活中 我们常常会遇到以下几种窘迫时刻 准备骑共享单车出行 却发现扫码开锁半天 车子都没有反应 手机导航打车 却发现地图定位偏差很大 司机总是跑错地方 买个水 却遭遇自动售货机吐币 或者不找零钱 好不容易休息打个游戏 却一直出现卡顿 闪退
  • 2024拒绝行业内卷!八年软件测试20K*16薪行业心得 想入行必看

    目前工作做软件测试工作8年 属于高级测试员那个级别吧 现在看到各行各业的人都在转行学习软件测试 想给大家一些学习建议和忠告 很多粉丝都跟我说今年行情很差 找不到工资 真的找不到工作了吗 我们常在网上看到的 程序员饱和 程序员过剩 其实一般是
  • 软件测试/测试开发/全日制/测试管理丨Android WebView 技术原理

    Android WebView是一个内置的组件 允许在Android应用中嵌套显示Web内容 Android WebView的技术原理涉及到使用WebKit引擎来渲染Web内容 并提供一系列API和回调函数 使得开发人员可以控制和定制Web
  • 外包干了2个月,技术倒退2年。。。

    先说一下自己的情况 本科生 20年通过校招进入深圳某软件公司 干了接近4年的 功能测试 今年国庆 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了四年的功能测试 已经让我变得不思进取 谈了3年的女朋
  • UI自动化测试之Jenkins配置

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

    一 认识YAML YAML YAML Ain t Markup Language 是一种人类可读的数据序列化语言 它的设计目标是使数据在不同编程语言之间交换和共享变得简单 YAML采用了一种简洁 直观的语法 以易于阅读和编写的方式表示数据结

随机推荐

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

    密码学与安全技术 工程领域从来没有黑科技 密码学不仅是工程 密码学相关的安全技术在整个信息技术领域的重要地位无需多言 如果没有现代密码学和信息安全的研究成果 人类社会根本无法进入信息时代 区块链技术大量依赖了密码学和安全技术的研究成果 实际
  • 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 页面时 所重现的各种行为依赖于测试人员的输入参数 例如 选择下拉餐单的项目 在文本框中输入字符等 不同的测试用例对应不同的输入 若有方法能够简单 有效的传入测试用参数