以后不在此处更新日志了,欢迎测友到新窝找我:http://www.wuchuanhu.cn/

让AutoIT支持Xpath

上一篇 / 下一篇  2012-03-20 14:32:04 / 个人分类:AutoIT实战

我们知道自动化测试工具Selenium支持很多种元素定位方式,比如属性、XpathCSS等等,强大的定位能力使得Selenium可以随心所欲的操作这些元素。相比之下,AutoIT就有点逊色了。通过对Selenium工作原理的分析,我们知道:Selenium Server通过向浏览器发出JavaScript调用实现对Html页面的全面追踪和对Html页面的操作,并通过网络把执行结果返回给Selenium客户端。如果能在AutoIT中实现向浏览器发送JavaScript调用,即可实现与Selenium同样的效果,也就可以实现Selenium中的各种元素定位方式。

XPath是一门在XML文档中查找信息的语言,使用它可以在页面中准确的定位到页面元素。Selenium中用于支持XpathJavaScript框架是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这样简单的定位方法,可是一旦元素的IdName这样的属性不存在的时候,就比较难定位了。上面的这段代码还有另一种写法:

#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函数:xpathquery),为了测试拼出来的这段JavaScript脚本是否被执行,于是在脚本中增加了“alert(test.snapshotLength)”。执行这段脚本结果如下图所示。


看到Alert提示框,说明JavaScript调用在页面中被执行了。

封装的xpathquery)函数如下:

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-xpathAutoIT中的使用说明了脚本语言之前其实也是可以相互补充相关增益的。鉴于这里介绍的内容,也可以将这种增强定位页面元素的方法引入到QTP以及其他的自动化测试工具中来。


TAG: aslandhu autoit Autoit AutoIT autoIT web Web

 

评分:0

我来说两句

Open Toolbar