江湖一直有着这么一句名言 "天下武功, 唯快不破". 那么在软件测试领域, 自然而然我们会想到软件自动化测试. 软件自动化测试的实现自然离不开软件自动化测试工具. 软件自动化测试工具是软件自动化的载体, 只有通过工具, 我们才能实现. 武林也是一样, 成为武功盖世, 除了武林秘决之外, 还要有依天剑, 屠龙刀的配合.
话说软件开发模式有: 瀑布模型, 增量式开发, 螺旋开发, 敏捷开发. 软件业早期的开发模式主要以瀑布模型为主, 后期逐渐专为敏捷开发. 软件开发效率和变更频率也随着开发模式的变化而变化, 优其到了敏捷开发模式. 一些传统的自动化测试工具显示力不从心, 很难应付软件开发的快速迭代和变更, 导致一些公司开展自动化测试, 徒劳无功. 主要原因有: 自动化用例建设速度慢, 跟不上软件新增内容; 软件变更频繁导致用例维护成本巨大; 学习成本高. 所有这些都是自动化测试在中国软件业难以建树的主要原因.
软件自动化测试工具工作流程: 新建用例 -> 调试用例 -> 行执行用例 -> 分析结果 -> 输出报告 -> 维护用例. 其中: 新建用例和维护用例是消耗最大的工作量. 敏捷开发模式的引入, 导致维护工量大大提升, 甚至一度有超过新建用例工作量的趋势, 这一直困扰软件自动化测试的一个头痛问题.
自动化用例维护环节中, 元素定位失效是一个主要原因. 下面我们看一下一些常用自动化工具的元素定位原理:
1,selenium 元素定位样例
以下是一段 Python+ selenium 的用例样例, 对元素的操作是以元素 id 为基础的
- from selenium import webdriver
- url = "http://10.98.110.44/egov-portal/egov/shIndex.html"
- # 打开浏览器, 最大化浏览器
- driver = webdriver.Chrome()
- driver.get( url )
- driver.implicitly_wait( 10 )
- driver.maximize_window()
- #输入账号
- driver.find_element_by_id("username").send_keys("zhangsan")
- #输入密码
- driver.find_element_by_id("password").send_keys("ww1234")
- #点击登录按钮
- driver.find_element_by_id("submitButton").click()
2,robotFramwork+seleniuLibrary 元素定位样例
3,UFT 工具元素定位方法样例
- Dialog("Login").WinEdit("AgentName:").Set "mercury"
- Dialog("Login_2").WinButton("Help").Click
- Dialog("Login_2").Dialog("FlightReservations").Static("The password is'MERCURY'").CheckCheckPoint("The password is 'MERCURY'")
- Dialog("Login_2").Dialog("FlightReservations").WinButton("确定").Click
- Dialog("Login").WinButton("OK").Click
- Windows("FlightReservation").Activate
- Windows("FlightReservation").ActiveX("MaskEdBox").Type "102715"
- # 选择日期
- Windows("Flight Reservation").WinComboBox("FlyFrom:").Select "Frankfurt"
从以上信息我看到, 元素的定位都是通过元素的属性定位, 元素属性主要有以下 8 种:
1,id 定位: driver.find_element_by_id("kw")
2,name 定位: driver.find_element_by_name("wd")
3,class 定位: driver.find_element_by_class_name("s_ipt")
4,tag 定位: driver.find_element_by_tag_name("input")
5,link 定位: driver.find_element_by_link_text("新闻")
6,partial_link 定位: driver.find_element_by_partial_link_text()
7,xpath 定位: driver.find_element_by_xpath("/html/body/div[2]/div/form/div/input")
8,CSS 定位: driver.find_element_by_css_selector
在现有的自动化软件当中, 都是以上述 8 种定位方式中的一种对元素进行定位. 现在现实的测试环境经常不是我们想象的那样平静. 页面中出现 id,name,tag 重复的很多. 也许在我们写用例的不重复, 经过一轮版本修改后很可能变得重复了. xpath 是最不可能失效的, 但是经常因父节点的修改而导致失效是常有的事. 因此自动化设计人员疲于奔命的维护用例, 工作量非常的巨大.
4, 元素智能定位
kylinTOP 的软件, 支持智能元素定位, 我比较感兴趣就去研究了一下, 该软件的用例主要通过录制生成, 录制生成一些可视化的脚本, 如下所示:
上图是点按钮的步骤, 步骤中记录了按钮的多个属性: title|alt,src,border,alt,xpath 以及它的孩子信息. 有些属性并不能唯一定位元素 (页面中存在重复), 如: border.kylinTOP 记录下了按钮元素的所有身份信息. 当笔者尝试修改页面代码中 title|alt 的值 , 使页面中 title|alt 的值有重复. 在脚本回放时, 仍然可以正常运行. 恢复 title|alt 值 , 重复上述修改步骤, 逐个修改其它属性值, 仍然不影响脚本运行. 通过测试发现, 修改按钮任何属性都不影响脚本执行.
通过阅读官网资料, 说元素定位是根据元素的一系列属性进行定位, 并不依赖于某一个属性, 采取的是一种元素智能定位算法. 在软件自动化测试领域, kylinTOP 的元素定位的确有过人之处, 大大提高了自动化用例执行的稳定性, 节省了用例的维护成本. 官网: http://www.70testing.com/
来源: https://www.cnblogs.com/kylinTOP/p/12490442.html