Python+Selenium自动化测试框架下树形菜单定位问题解决方案

发表于:2019-9-26 13:26

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:李辉    来源:51Testing软件测试网原创

  一、对象定位方法简述
  自动化测试是指以人为驱动的测试行为转化为机器执行的一种过程。和人工测试一样界面自动化测试可以分为三个部分,对象定位、对象操作和逻辑判断。人工测试过程中对象定位是最简单一步,测试人员不需要经过复杂的处理就可以找到想操作的对象,对象操作和逻辑判断才是测试的关键内容。但在进行自动化测试的时候,对象的定位和对象操作、逻辑判断一样复杂,需要根据不同对象的特点找到合适的方法通过脚本来实现定位。 因为对象定位是对象操作和逻辑判断的前提,如果无法定位,后边的操作也就变得没有意义,所以说对象定位是自动化测试最关键的一步一点都不为过。
  因为对象的特点不同,常用的Selenium自动化定位方法也有很多,简要总结如下:
  1.采用id进行定位,应用python脚本函数为driver.find_element_by_id("id值");
  2.采用name进行定位,应用python脚本函数为driver.find_element_by_name("name值");
  3.采用class_name进行定位,应用python脚本函数为driver.find_element_by_class_name("class_name值");
  4.采用tag_name进行定位,应用python脚本函数为driver.find_element_by_tag_name("tag_name值");
  5.采用link_text进行定位,应用python脚本函数为driver.find_element_by_link_text("link_text值");
  6.采用partial_link_text进行定位,应用python脚本函数为driver.find_element_by_name("partial_link_text值");
  7.采用css进行定位,应用python脚本函数为driver.find_element_by_css_selector("css值");
  8.采用xpath进行定位,应用python脚本函数为driver.find_element_by_xpath("xpath值")。
  针对不同的方法,火狐浏览器都提供了方便的对象属性值的查找和复制方法,可以极大的提高自动化脚本的编写效率。
  二、问题
  对象的定位就是发现对象的特点,应用对象的特点进行描述找到对象的过程。但是如果这个对象没有任何特点,它的属性不是不确定就是和页面中的其他对象相同该怎么办呢。在实际应用中我们就经常会遇到想定位的对象用上边介绍的直接定位法无法定位到情况。下面举一个例子来分析一下它的特点:
  下图是被测系统的交易菜单列表的一部分:
  分析每个菜单的HTML代码,发现每一个菜单节点都是多个对象的组合。
  以会计估值系统这个菜单为例,下边包含如下对象:
  对象1为加号前边的空白处,
  对象2为加号按钮,
  对象3为文件夹图标,
  对象4为菜单文字内容。
  在手工测试时,我们点击菜单便可以打开菜单下的内容,操作的其实是加号按钮,单击其他对象无法实现打开菜单的功能。但是想定位到加号按钮,应用上文总结的所有直接定位方法都无法做到,主要有两方面原因:
  1、应用该对象的其他属性信息无法唯一定位。下图为“会计估值系统”菜单对应的加号对象和“通用参数维护”菜单对应的加号对象的属性信息对比,可以看到除了id对象之外,class属性值都为“x-tree-ec-icon x-tree-elbow-plus”,src属性值都为“http://10.233.93.65:234/FCA/images/s.gif”。下图为两个对象属性信息的内容对比:
  2、每次重新打开系统页面,对象的id不同。下面两个图分别是两次打开系统菜单“会计估值系统”节点对应的加号对象的id值,分别是ext-gen383和ext-gen418。另外应用火狐浏览器取到的css值都是#号加id值,取到的xpath值为//*[@id="id值"],因为id值不断变化所以该属性也无法应用。
  下图为第一次打开系统加号对象的id值,
  下图为第二次打开系统加号对象的id值。
  三、解决方案
  通过上边的分析我们发现,直接定位到想要的对象已经没有可能。这时只能换一个思路,看能否定位其中一个对象然后找想定位的对象和能定位到的对象的关系,间接进行定位。因为同一级的交易菜单名称是不会重复的,我们可以应用text内容定位到菜单名称对应的span对象,而目标对象是该对象的父对象的兄弟对象。如下图:
  应用上述思路需要首先实现应用text内容定位到菜单名称对应的span对象,具体实现脚本driver.find_element_by_xpath("//span[contains(text(),'会计估值系统')]")。添加click事件测试可以选中。测试过程如下:
  在此基础上,需要找到该对象的父节点然后找到兄弟节点,xpath找到父节点的语法为//div/..,找到第一个子节点的语法是img[1],img是属性类型。目标对象是可以定位到的对象的父对象的兄弟对象的属性是img的第一个对象。具体脚本可以写成driver.find_element_by_xpath("//span[contains(text(),'会计估值系统')]/../../img[1]")。添加click事件测试可以成功打开交易菜单。
  四、总结
  对于交易菜单这类具有树形结构,虽然根据对象的属性无法定位,但是树形结构下各个对象之后有比较严格的位置关系,可以通过先定位一个对象之后然后再通过固定的位置关系找到目标对象。

      本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号