• QTP11使用DOM XPath以及CSS识别元素对象


    我们知道,像DOM,Html,CSS,XPath等对对象的识别策略广泛运用于一些开源的工具,例如:Selenium,Watir,Watir-Webdriver,以前qtp版本是不支持这些东西的,现在qtp11对这些已经支持了,下面我们就看看这些特性:

             Document Object Model(DOM):这东西干嘛的 ,百度之。

    像下面的这些方法能应用在qtp中:

    方法

    描述

    getElementById

    使用已知的元素id,返回第一个页面元素

    getElementsByName

    返回具有指定名称的一个JavaScript数组中的所有元素

    getElementsByTagName

    返回与指定的标记名的JavaScript数组的所有元素

     

    在qtp里调用JavaScript 方法:

    Object.RunScript(script)

    例如:

    Browser("title:=百度一下,你就知道").Page("title:=百度一下,你就知道").RunScript ("alert('hello');")

    Using HTML DOM Methods & Properties in QTP:

    要访问HTML DOM方法,我们需要使用的文档对象,我们可以使用getElementById这个方法,用他的id来获取页面元素。例如:

    Set  kws=Browser("title:=百度一下,你就知道").Page("title:=百度一下,你就知道").RunScript ("document.getElementById('kw');")

                         kws.value ="百度一下"

    Set  us=Browser("title:=百度一下,你就知道").Page("title:=百度一下,你就知道").RunScript ("document.getElementById('su');")

                         us.click

             但是我们对于一些页面没有定义id的但是定义了名称,我们就可以使用getElementsByName这个方法来解决,例如:

    Set  kws=Browser("title:=百度一下,你就知道").Page("title:=百度一下,你就知道").RunScript ("document.getElementsByName('wd')(0);")

                         kws.value ="百度一下"

    而这里使用getElementsByName注意需要索引值,因为他是返回一个JavaScript数组。

             如果使用getElementsByTagName,我们就不需要name或者id了。例如:

    Set  kws=Browser("title:=百度一下,你就知道").Page("title:=百度一下,你就知道").RunScript ("document.getElementsByTagName('input')(0);")

                    kws.value ="百度一下"

    这里不好的地方就是,当有多个的时候,它的index属性无法直接写出并且当index改变了,脚本也要改变。

          

    通常情况下,我们都是使用组合键来识别相应的元素对象,例如:

    set wd=Browser("name:=.* - 六间房秀场.*").Page("title:=.* - 六间房秀场.*").RunScript ("document.getElementById('chatForm').getElementsByTagName('input')(2) ;")

                  wd.value ="testing"

     

    与此同时,我们也可以使用元素之间的关系来识别一些元素,例如:

    document.getElementById(‘XXX’).firstChild

    通过使用getElementById返回第一个子元素

    document.getElementById(‘XXX’).lastChild

    通过使用getElementById返回最后一个子元素

    document.getElementById(‘XXX’).parentNode

    通过使用getElementById返回父节点

    document.getElementById(‘XXX’). nextSibling

    通过使用getElementById返回下一个兄弟元素

    document.getElementById(‘XXX’). previousSibling

    通过使用getElementById返回前一个兄弟元素

    使用XPath:

    在QTP11中,XPath是另一种重要的识别元素的方式,当然它也像其它工具一样被广泛的应用于开源工具中,下面就介绍下载qtp11中改方式的特性。

    XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。

    XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初 XPath 的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是 XPath 很快的被开发者采用来当作小型查询语言。(详细的介绍看这里:http://zh.wikipedia.org/wiki/XPath

    QTP提供了两种使用XPath的方式,一种是在tools-àoptions—>Webàadvanced中;另一种就是你自己通过编程使用XPath的方法和属性。

    这里主要介绍第二种:

    下面就看一个采用描述性编程来使用XPath的方法的例子:

    Browser("name:=百度一下,你就知道").Page("title:=百度一下,你就知道").WebEdit("xpath:=//input").Set "testing"

    在这个例子中,我们使用的是//input,”//”在xpath中表示贪婪查询,他会变量html中所有的元素,直到找到为止。

    同时如果我们知道元素的确定位置,我们也可以利用绝对路径来定位,如:

    Browser("name:=百度一下,你就知道").Page("title:=百度一下,你就知道").WebEdit("xpath:=/html/body/div[2]/div/form/input").Set "testing"

    这里比较麻烦的是,这个绝对路径,我们可以通过火狐来查看同时采用这个定位是非常快的,不过元素如果改变了,就悲催了~~~,未完待续~~~

    下面来介绍,在xpath中使用元素属性来定位元素:

    常用的元素属性有,ID,name,index,value,type 等,在xpath中,我们可以这样使用:

    Xpath:=//element[@attribute=’ attribute  value’]

    例如:

    Browser("name:=百度一下,你就知道").Page("title:=百度一下,你就知道").WebEdit("xpath:=//input[@id='kw']").set "testing"

    当然,我们也可以使用多个属性来定位元素,如:

    Xpath:=//element[@attribute=’ attribute  value’   and @attribute=’ attribute  value’ ]

    Browser("name:=百度一下,你就知道").Page("title:=百度一下,你就知道").WebEdit("xpath:=//input[@id='kw'    and  @type='text' ] ").set "testing"

    在一些使用AJAX构建的网站,通常他们的元素属性是动态的,例如ids,name,他们随着网页动态加载变化而变化,此时我们可以使用部分匹配的原则来定位这些元素。

    在xpath中,提供了一些常见的函数,例如:cotains(),start-with(),end-with(),语法如下:

    //element[start-with(@attribute,’attribute partial value’)]

    // element[end-with(@attribute,’attribute partial value’)]

    //element[cotains(@attribute,’attribute partial value’)]

    例如下面的例子:

    <div id='login_area'>

        <input type='text' id='text_1'>

    </div>

    我们可以这样定位元素:

    Browser("name:=XXX").Page("title:=XXX").WebEdit("xpath:=//div[@id=' login_area '/input[start-with(@id,’text_’)]' ] ").set "testing"

    同理,其它方法也是这样用。

    在这里有一种方法,直接使用text()来定位元素,这个是很方便的。语法如下:

    //element[text()='inner text']

    例如:

    Browser("name:=百度一下,你就知道").Page("title:=百度一下,你就知道").link("xpath:=//a[text()='注册']").Click

    当然我们也可以结合contains(),start-with()来使用。

    语法如下:

    //element[contains(text(),’inner text’)]

    例如:

    ss=Browser("name:=百度一下,你就知道").Page("title:=百度一下,你就知道").link("xpath:=//a[contains(text(),'注')]").GetROProperty("name")

    msgbox ss  ‘ss=注册

    在qtp11中还介绍了关于xpath轴的知识,这部分没找到相关例子,就不介绍了,感兴趣的去看下w3school上关于xpath轴的介绍。

    CSS在QTP11中使用:

    QTP11中也增加了CSS来识别页面对象属性,关于css的介绍以及使用可以看w3school。

    在qtp11中使用css的语法如下:

    Css:=Element.class_attribute

    例如:

    Browser("name:=百度一下,你就知道").Page("title:=百度一下,你就知道").WebEdit("css:=input.s_ipt ").set "testing"

    在dom,xpath中均能使用id,在css中也可以使用id。在css中使用id的语法如下:

    Css:=element#id

    例如:

    Browser("name:=百度一下,你就知道").Page("title:=百度一下,你就知道").WebEdit("css:=input#kw ").set "testing"

    当然,在css中我们也可以使用元素的属性来识别页面对象,其语法如下:

    Css:=element[attribute=value]

    例如:

    Browser("name:=百度一下,你就知道").Page("title:=百度一下,你就知道").WebEdit("css:=input[name=wd] ").set "testing"

    另外,css中也提供了类似xpath中的部分识别属性的方法,具体方法如下:

     

    Operator

    Description

    ^=attribute_value

    找到以给定的属性值的开始的元素,这个和xpath中的 starts-with()函数相似。

    *= attribute_value

    找到包含给定属性值的元素. 这个和xpath中的 contains()函数相似。

    $= attribute_value

    找到以给定的属性值的结束的元素. 这个和xpath中的 ends-with()函数相似。

    例如:

    <div id='login_area'>

    <input type='text' name='text_1'>

    </div>

    Browser(title:=XXX).Page(title:=xxx).WebEdit(“css:=div#login_area  input[name^=’text_’]”).set “testing”

    或者

    Browser(title:=XXX).Page(title:=xxx).WebEdit(“css:=div#login_area  input[name*=’text_’]”).set “testing”

    在css中,也可以使用text()来定位,具体语法如下:

    Css:=element:contains(‘text’)

    Browser("name:=百度一下,你就知道").Page("title:=百度一下,你就知道").link("css:=a:contains('注册')").Click

  • 相关阅读:
    python之isinstance和issubclass
    python中类的继承
    python中面向对象
    python中常用的内置模块
    Python常用模块
    python中的常用内置模块
    python中的包、模块及导入
    python中的内置函数(二)
    国内7大核心期刊
    PS学习列表
  • 原文地址:https://www.cnblogs.com/zthua/p/2965453.html
Copyright © 2020-2023  润新知