《精通自动化测试框架设计》—第2章 2.4节使用XML文件

简介: XML,可扩展的标识语言(eXtensible Markup Language),其先驱是SGML和HTML。1996年万维网协会(W3C)开始设计一种可扩展的标记语言,使其能够将SGML的灵活性和强大功能与已经被广泛采用的HTML结合起来。

本节书摘来自异步社区《精通自动化测试框架设计》一书中的第2章,第2.4节使用XML文件,作者陈冬严 , 邵杰明 , 王东刚 , 蒋涛,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.4 使用XML文件
XML,可扩展的标识语言(eXtensible Markup Language),其先驱是SGML和HTML。1996年万维网协会(W3C)开始设计一种可扩展的标记语言,使其能够将SGML的灵活性和强大功能与已经被广泛采用的HTML结合起来。1998年2月,XML 1.0 成为了W3C 的推荐标准(顺便说一下Webdriver现在也是W3C推荐标准)。XML最大的优势在于对各种数据的跨平台管理,任何操作系统,包括Windows 、MacOS 、Linux 以及其他平台都可以通过XML的解析器来读取XML数据,并且以XML格式输出结果。虽然早在2004年就有人喊出了“XML在互联网上已经失败”(XML on the Web Has Failed[1])的口号,但目前XML仍是目前事实上的系统间数据交换的标准。

2.4.1 Webdriver中的定位方法
俗话说女大十八变。用这句话来形容B/S架构的软件产品的用户界面也是非常贴切的。UI自动化的一大挑战就是如何应对经常变化的界面,将界面定位的维护成本控制在一个较为合理的范围内。这其中一个比较好的实践就是将界面元素的定位信息保存在外部文件中,如XML,作为运行时框架类的输入数据,动态地导入到其对应的页面类中供定位使用。

Webdriver中通过实现了By这一接口的各个driver类的实例来进行元素定位。典型的用法如下例所示:

WebElement element = driver12.findElement(By.id("eleId"));  
List< WebElement >elements= driver.findElements(By.className("eleClass"));

第一个方法返回一个WebElement实例或者抛出异常。后者返回所有找到的WebElement的实例列表或者空列表。

其中,By这个接口中定义的元素定位的方法有如下8种。

By.className(className)) 
By.cssSelector(selector) 
By.id(id)     
By.linkText(linkText)  
By.name(name)     
By.partialLinkText(linkText)
By.tagName(name)   
By.xpath(xpathExpression)

按照一般的理解,通过id或者name去定位一个元素效率上是最高的,也是比较推荐的一种方式。不过在很多情况下,一些开发规范遵守的不是很好的工程组织,可能对于给每个页面元素进行命名这种事情做得并不太好,或者随着现在比较主流的前端框架,或者开发库,如ExtJs、JQuery等,一般都采用随机或者相同的id、name等,需要采用更为复杂的定位方法。这在后续章节中会有详细的介绍。

接下来根据一个样例来介绍如何进行 XML 文件的解析。假定有如下一个名叫LocatorPaser.xml的文件。

< ?xml version="1.0" encoding="UTF-8"? >
  < datasets name="ds1" >
    < locators name="LoginSeMet" >
    < locator name="loginLocator" by="id" >login< /locator >
    < locator name="pwdLocator" by="name" >tl_password< /locator >
    < locator name="submitLocator" by="xpath" >//input[@name='login_submit']< /locator >
    < /locators >
  < /datasets >

从该XML文件的格式上看,单个定位数据以locator标记为一个元素,元素属性分别有name、by,而元素内容就是by对应的定位方法需要的定位信息。locator之间彼此独立,并同属于一个带locators标签的父元素。

从文件内容上看,该XML文件维护着某一被测应用UI自动化测试中的定位信息,并且显而易见是一个登录页面中有关用户名、密码输入框以及登录按钮这3个页面元素的定位信息。其中用户名和密码输入框分别使用了"id"、"name"等属性,而登录按钮则使用了XPath的定位串。

在实践中使用最为广泛、表现也最为稳定的可能是XPath或者cssSelector这两大流派。首先,对于其他定位方式来说,这两个都是可以由相应方法实现相同的目的。其次两者虽然采用的技术路线不同,所能达到的效果也基本是伯仲之间。因此,只要学好学精一门,其余略懂即可。在本书中主要采用XPath来介绍相关的元素定位技术。相信采用cssSelector的读者可以较为方便地进行转换。当然本节的主题是有关XML的解析,有关XPath等元素定位的基本方法,可以参见本书最后一部分有关Webdriver的基础知识介绍。

2.4.2 使用dom4j进行解析
接下来将使用dom4j这一第三方工具以SAXReader的方式完成该文件的解析,来简要介绍如何处理来自XML的数据信息。dom4j 是由dom4j.org维护的一款非常优秀的 Java XML开源解析工具包,读者可以从http://sourceforge.net/projects/dom4j/获取其最新版本。它具有性能优异、功能强大和极端易用的特点,为众多开源项目所采用。

SAX(Simple API for XML)是一种事件驱动的XML API,其采用了输入流的方法,按照事件模型来解析XML文档。因为不必像DOM那样加载整个文档,因此它对内存的要求较低,解析更快速、更轻量,非常适合于本案例中对于XML文件的只读访问。

下述LocatorPaser类将对前述的XML文件进行解析,最终获取到像"xpath=//input [@name='login_submit']"这样的定位串,可以用于后续的元素定位。类的具体实现如下:

public class LocatorPaser {
  private Document doc; //定义Document文档对象
  public LocatorPaser() { //在默认构造方法中完成对XML文件的解析
  InputStream in=getInputFileAsStream(this.getClass());
     SAXReader reader = new SAXReader(); //得到解析器
    try {
      doc = reader.read(in); //解析文档
    } catch (DocumentException e) {
    e.printStackTrace();
    }
  }

  public static InputStream getInputFileAsStream(Class< ? > testClass) {
    String packageName = "";
    if (testClass.getPackage() != null) {
      packageName = testClass.getPackage().getName() + ".";
    }
    String resourceBase = (packageName + testClass.getSimpleName()).replace('.', '/'); 
    //得到当前类的完整路径
    String resourceName;
    ClassLoader classLoader = testClass.getClassLoader();
    resourceName = resourceBase + ".xml"; 
    //XML文件与当前类同名,且在同一目录下
    System._b>out__.println("Searching for default input file: " + resourceName);
    return classLoader.getResourceAsStream(resourceName);
    //完成同名XML文件资源的获取
  }
  public String getLocator(String name) {
    String locator=null;
  Element datasets = (Element) this.doc.selectSingleNode("//datasets"); 
  //查找到"datasets"标签
  for (Iterator d = datasets.elementIterator("locators"); d.hasNext();) { 
  //开始定位串解析
    Element data = (Element) d.next();
    for (Iterator e = data.elementIterator("locator"); e.hasNext();) {
       Element elem = (Element) e.next();
       String value= elem.valueOf(".") //获取当前节点值
       String nameString=elem.valueOf("@name"); //获取name属性值
       System._b>out__.println("\n'"+nameString+"'");
           if(name.equalsIgnoreCase(nameString)){
            if (!elem.valueOf("@by").isEmpty()){ 
              locator=elem.valueOf("@by")+"="+value; 
//将by属性值与当前节点值进行拼接,如"xpath=//input[@name='login_submit']"
            }
          break;  //完成解析,跳出循环
        }
      }
    }
    return locator; //返回定位串或者null
  }
  //接下来是一个简单的测试
  @Test
  public void testPaser(){
  String locator="loginLocator";
  long curTime=System.currentTimeMillis();
  String resultString=this.getLocator(locator);
  long delta=System.currentTimeMillis()-curTime;
  System._b>out__.println("\n"+locator+"='"+resultString+"'\nTime used(ms)::"+delta);
  }

上述测试用例在一台笔记本上的执行结果是:

loginLocator='id=login'
Time used(ms)::183

结果正确,文件解析的效率也是不错的。

相关文章
|
2天前
|
机器学习/深度学习 算法 异构计算
m基于FPGA的多通道FIR滤波器verilog实现,包含testbench测试文件
本文介绍了使用VIVADO 2019.2仿真的多通道FIR滤波器设计。展示了系统RTL结构图,并简述了FIR滤波器的基本理论,包括单通道和多通道的概念、常见结构及设计方法,如窗函数法、频率采样法、优化算法和机器学习方法。此外,还提供了Verilog核心程序代码,用于实现4通道滤波器模块,包含时钟、复位信号及输入输出接口的定义。
19 7
|
13天前
|
XML Java 数据库连接
mybatis中在xml文件中通用查询结果列如何使用
mybatis中在xml文件中通用查询结果列如何使用
13 0
|
15天前
|
XML JavaScript 前端开发
xml文件使用及解析
xml文件使用及解析
|
1月前
|
XML C# 数据格式
使用C#操作XML文件
使用C#操作XML文件
11 0
|
30天前
|
传感器 算法 计算机视觉
基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容是关于一个基于肤色模型和中值滤波的手部检测算法的描述,包括算法的运行效果图和所使用的软件版本(matlab2022a, vivado2019.2)。算法分为肤色分割和中值滤波两步,其中肤色模型在YCbCr色彩空间定义,中值滤波用于去除噪声。提供了一段核心程序代码,用于处理图像数据并在FPGA上实现。最终,检测结果输出到&quot;hand.txt&quot;文件。
|
1月前
|
算法 异构计算
m基于FPGA的电子钟verilog实现,可设置闹钟,包含testbench测试文件
该文介绍了基于FPGA的电子钟设计,利用Vivado2019.2平台进行开发并展示测试结果。电子钟设计采用Verilog硬件描述语言,核心包括振荡器、分频器和计数器。时间显示为2个十进制格式,闹钟功能通过存储器和比较器实现,当当前时间等于设定时间时触发。文中给出了Verilog核心程序示例,展示了时钟信号、设置信号及输出的交互。
27 2
|
2天前
|
XML 数据格式
小米备份descript.xml文件
小米备份descript.xml文件
10 0
|
5天前
|
XML C# 数据格式
C# 解析XML文件
C# 解析XML文件
14 1
|
8天前
|
SQL 存储 分布式计算
Hive【基础知识 02-2】【Hive CLI 命令行工具使用】【详细举例-包含测试脚本文件】
【4月更文挑战第7天】Hive【基础知识 02-2】【Hive CLI 命令行工具使用】【详细举例-包含测试脚本文件】
16 0
|
30天前
Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)
Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)
15 1