我们知道自动化测试工具Selenium支持很多种元素定位方式,比如属性、Xpath、CSS等等,强大的定位能力使得Selenium可以随心所欲的操作这些元素。相比之下,AutoIT就有点逊色了。通过对Selenium的工作原理的分析,我们知道:Selenium Server通过向浏览器发出JavaScript调用实现对Html页面的全面追踪和对Html页面的操作,并通过网络把执行结果返回给Selenium客户端。如果能在AutoIT中实现向浏览器发送JavaScript调用,即可实现与Selenium同样的效果,也就可以实现Selenium中的各种元素定位方式。 XPath是一门在XML文档中查找信息的语言,使用它可以在页面中准确的定位到页面元素。Selenium中用于支持Xpath的JavaScript框架是ajaxlt,根据需要还可以更换为JavaScript-Xpath。相比之下JavaScript-Xpath查询效率更高,更快定位到页面元素。这里将使用JavaScript-Xpath来扩展AutoIT,让其支持Xpath定位。 首先下载JavaScript-Xpath最新版本。 (http:///projects/js-xpath/files/) 下面开始以打开百度并输入“Hello,world”搜索为例,讨论如何在AutoIT中使用JavaScript-Xpath。 正常情况下,我们使用AutoIT实现这样的操作,代码如下: #include<IE.au3> $oIE = _IECreate("http://www.baidu.com") $Input = _IEGetObjById($oIE,"kw") $Btn = _IEGetObjById($oIE,"su") $Input.innertext="Hello,World" $Btn.click 会使用到_IEGetObjById、_IEGetObjByName这样简单的定位方法,可是一旦元素的Id与Name这样的属性不存在的时候,就比较难定位了。上面的这段代码还有另一种写法: #include<IE.au3> $oIE = _IECreate("http://www.baidu.com") $oIE.document.getElementById("kw").value='Hello,World' $oIE.document.getElementById("su").click 现在,我们使用Xpath的方法来定位baidu首页上的这个搜索按钮。首先使用FireFox的插件Firebug来获取到这个按钮的Xpath表达式。 得到这个表达式之后,就可以开始我们的定位之旅了。 #include<IE.au3> Global $oIE = _IECreate("http://www.baidu.com") $oIE.document.getElementById("kw").value='hello' js(FileRead("javascript-xpath-latest.js")) $test='var test = xpath("' $test=$test&"//Input[@id='su']"&'")' $test=$test&';/*alert(test.snapshotLength)*/;test.snapshotItem(0).click()' js($test) Func js($script) $oIE.document.parentWindow.eval($script) EndFunc 这里首先是使用document.parentWindow.eval或者document.parentWindow.execscript向页面导入JavaScript-Xpath库,然后在执行定位和操作元素的javascript脚本。 $test='var test = xpath("' $test=$test&"//Input[@id='su']"&'")' $test=$test&';alert(test.snapshotLength);test.snapshotItem(0).click()' 这几行脚本中引用了一个封装的JavaScript函数:xpath(query),为了测试拼出来的这段JavaScript脚本是否被执行,于是在脚本中增加了“alert(test.snapshotLength)”。执行这段脚本结果如下图所示。 看到Alert提示框,说明JavaScript调用在页面中被执行了。 封装的xpath(query)函数如下: function xpath(query) { return document.evaluate(query, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); } 为了让脚本看起来更简洁,可以将拼接JavaScript脚本的那几行代码封装成一个函数。 Func OperateObjByXpath($Xpath,$Op) $test='var test = xpath("' $test=$test&$Xpath&'")' $test=$test&';test.snapshotItem(0).'&$Op js($test) EndFunc 那么我们的测试脚本可以精简为: #include<IE.au3> Global $oIE = _IECreate("http://www.baidu.com") js(FileRead("javascript-xpath-latest.js")&FileRead("jquery-1.7.min.js")) OperateObjByXpath("//Input[@id='kw']","value='Hello,world'") OperateObjByXpath("//Input[@id='su']","click()")javascript-xpath在AutoIT中的使用说明了脚本语言之前其实也是可以相互补充相关增益的。鉴于这里介绍的内容,也可以将这种增强定位页面元素的方法引入到QTP以及其他的自动化测试工具中来。 |
|