我们知道自动化测试工具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://sourceforge.net/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以及其他的自动化测试工具中来。