《精通自动化测试框架设计》—第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

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

相关文章
|
4月前
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
|
7月前
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
11月前
|
XML 前端开发 Java
讲解SSM的xml文件
本文详细介绍了SSM框架中的xml配置文件,包括springMVC.xml和applicationContext.xml,涉及组件扫描、数据源配置、事务管理、MyBatis集成以及Spring MVC的视图解析器配置。
219 1
|
5月前
|
安全 关系型数据库 MySQL
MySQL8使用物理文件恢复MyISAM表测试
MySQL8使用物理文件恢复MyISAM表测试
82 0
|
9月前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
241 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
11月前
|
运维
【运维基础知识】用dos批处理批量替换文件中的某个字符串(本地单元测试通过,部分功能有待优化,欢迎指正)
该脚本用于将C盘test目录下所有以t开头的txt文件中的字符串“123”批量替换为“abc”。通过创建批处理文件并运行,可实现自动化文本替换,适合初学者学习批处理脚本的基础操作与逻辑控制。
610 56
|
10月前
|
Java Maven
maven项目的pom.xml文件常用标签使用介绍
第四届人文,智慧教育与服务管理国际学术会议(HWESM 2025) 2025 4th International Conference on Humanities, Wisdom Education and Service Management
780 8
|
10月前
|
XML Android开发 数据格式
Eclipse 创建 XML 文件
Eclipse 创建 XML 文件
137 2
|
11月前
|
XML JavaScript Java
java与XML文件的读写
java与XML文件的读写
143 3
|
11月前
|
安全 Linux 网络安全
Kali渗透测试:自动播放文件攻击
Kali渗透测试:自动播放文件攻击
161 0