zoukankan      html  css  js  c++  java
  • XPath 定位----光荣之路

    被测试网页的HMTL代码

    <html>
        <body>
            <div id="div1">
                <input name="div1input"></input>
                    <a href="http://www.sogou.com">搜狗搜索</a>
                        <img alt="div1-img1" src="http://www.sogou.com/images/logo/new/sogou.png" href="http://www.sogou.com">搜狗图片</img>
                <input type="button" value="查询"></>
            </div>
            <br>
            <div name="div2">
                <input name="div2input"></input>
                    <a href="http://www.baidu.com">百度搜索</a>
                        <img alt="div2-img2" src="http://www.baidu.com/img/bdlogo.png" href="http://www.baidu.com">百度图片</img>
            </div>
        </body>
    </html>

    绝对路径定位方式:

    在被测试网页中,查找第一个 div 标签中的按钮。

    XPath的表达式: /html/body/div/input[@value="查询"]

    Java的定位语句: WebElement button= driver.findElement(By.xpath("/html/body/div/input[@value='查询']"));

    相对路径定位方式:

    在被测试网页中,查找第一个 div 标签中的按钮。
    XPath的表达式:
    // input[@value="查询"]
    Java的定位语句:
    WebElement button= driver.findElement(By.xpath("//input[@value='查询']"));

    XPath 使用索引号定位

    被测试网页的HMTL代码

    使用索引号定位方式: 在被测试网页中,查找第二个 div 标签中的“查询”按钮。

    XPath的表达式: //input[2]

    Java的定位语句: WebElement button= driver.findElement(By.xpath("//input[2]"));

    XPath 使用页面元素的属性值定位

    使用页面属性值方式:

    我们尝试定位被测试网页中的第一个图片元素。
    XPath 的表达式
    //img[@alt='div1-img1']
    Java的定位语句:
    WebElement img= driver.findElement(By.xpath("//img[@alt='div1-img1']"));

    XPath 使用页面元素的属性值定位

    预期定位的页面元素 

    定位表达式示例 

      使用的属性值 

    定位页面的第一个图片 

    //img[@href='http://www.sogou.com'] 

      使用img标签的href属性值  

    定位第二个div中第一个Input输入框 

    //div[@name='div2']/input[@name='div2input'] 

      使用div标签的name属性值 

      使用 input标签的name 属性值  

    定位第一个div中的第一个链接 

    //div[@id='div1']/a[@href='http://www.sogou.com'] 

      使用的div标签的id 属性值 

      使用了a标签的href属性值  

    定位页面的查询按钮 

    //input[@type='button'] 

      使用了type属性值 

    XPath 使用模糊页面属性值定位

    XPath函数 

    定位表达式示例 

    表达式解释 

    Starts-with() 

    //img[starts-with(@alt,'div1')] 

    查找图片alt属性开始位置包含’div1’关键字的页面元素 

    Contains() 

    //img[contains(@alt,'g1')] 

    查找图片alt属性包含’g1’关键字的页面元素 

    使用 XPath 的轴(axis)进行元素定位

    轴:
    XPath轴(XPath Axes)可定义某个相对于当前节点的节点集:
    1、child 选取当前节点的所有子元素
    2、parent 选取当前节点的父节点
    3、descendant 选取当前节点的所有后代元素(子、孙等)
    4、ancestor 选取当前节点的所有先辈(父、祖父等)
    5、descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身
    6、ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身
    7、preceding-sibling 选取当前节点的开始标签之前的所有同级节点
    8、following-sibling 选取当前节点的结束标签之后的所有同级节点
    9、preceding 选取文档中当前节点的开始标签之前的所有节点
    10、following 选取文档中当前节点的结束标签之后的所有节点
    11、self 选取当前节点
    12、attribute 选取当前节点的所有属性
    13、namespace 选取当前节点的所有命名空间节点

                                                                 

    XPath轴关键字 

    轴的含义说明 

    定位表达式示例 

    表达式解释 

    ancestor 

    选择当前节点上层的所有节点 

    //img[@alt='div2-img2']/ancestor::div 

    查找到alt属性值为div2-img的图片,并基于图片位置找到他上级的div页面元素 

    descendant 

    选择当前节点下层的所有节点

    注:不能超出当前节点的结束标签

    //div[@name='div2']/descendant::img 

    查找到name属性值的div页面元素,并基于div的位置找到他下级所有节点中的img页面元素 

    following 

    选取当前节点的结束标签之后的所有节点

    注:仔细体会与descendant的区别

    //div[@id='div1']/following::img 

    超找到id 属性值为div1的div页面元素,并基于div的位置找到它后面(结束标签之后)节点中的img页面元素 

    following-sibling 

    选取当前节点的结束标签之后的所有平级节点 ,自上而下,离当前结点最近的为索引1,越往下数字越大。 

    //a[@href='http://www.sogou.com']/follo 

    wing-sibling::input 

    查找到链接地址为http://www.sogou.com的链接页面元素,并基于链接的位置找到它后续节点中input页面元素 

    preceding 

    选择当前节点开始标签之前的所有节点 

    //img[@alt='div2-img2']/preceding::div 

    查找到alt属性值为div2-img2的图片页面元素,并基于图片的位置找到它前面节点中的div页面元素 

    preceding-sibling 

    选择当前节点开始标签之前的所有同级节点,自下而上,离当前结点最近的为索引1,越往上数字越大。 

    //img[@alt='div2-img2']/preceding-sibling 

    ::a[1] 

    查找到alt属性值为div2-img2的图片页面元素,并基于图片的位置找到它前面同级节点中的第二个链接页面元素 

    XPath 使用页面元素的文本定位

    例1

    使用text()函数可以定位到包含某些关键字的页面元素

    XPath的表达式:

    1) //a[text()='百度搜索']

    2) //a[contains(text(),'百度')]

    3) //a[contains(text(),'百度')]/preceding::div

    Java 的定位语句:
    WebElement a=driver.findElement(By.xpath("//a[text()='百度搜索']"));
    WebElement a=driver.findElement(By.xpath("//a[contains(text(),'百度')]"));
    WebElementdiv=driver.findElement(By.xpath("//a[contains(text(),'百 度')]/preceding::div"));

     例2:实际项目

     目的:通过角色名称,来点击'编辑'这个图片超链接。

    1 name 表示角色名称
    2 
    3 lineXpath = u"//div[@id='body2']/descendant::a[text()='%s']" % name
    4 editXpath = u"%s/ancestor::tr/descendant::img[@title='编 辑']" % lineXpath
    5 webApi.clickBy(driver, by.xpath_(editXpath), 2, 0)

    例3:实际项目

    目的:通过输入框定位框前面的标题和框后面的提示信息。使用ancestor而不用parent,因为当前元素的父元素可能不是td(嵌套div之类的),后面的preceding-sibling一定要加,不加会定位多个td,包括顶层的td。

     1 def getTipInfo2(driver, idList):
     2     u'返回以输入框标题为key,以提示信息为value的字典'
     3     msgList = []
     4     for editId in idList:
     5         titleXpath = u"//*[@id='%s']/ancestor::td/preceding-sibling::td[1]" % editId
     6         title = webApi.getTextBy(driver, by.xpath_(titleXpath), 2)
     7         tipInfo = webApi.getTextBy(driver, by.id_(editId + u'Tip'), 2)
     8         tempTuple = title, tipInfo
     9         msgList.append(tempTuple)
    10     for k, v in dict(msgList).iteritems():
    11         if (u'OK' not in v) and (len(v.strip())>0):
    12             print u"操作项'%s'失败,提示信息:'%s'" % (k, v)
    13     return dict(msgList)

    结果:

    操作项'选择角色*:'失败,提示信息:'管理员角色必填!'
    操作项'管理员账号*:'失败,提示信息:'管理员账号必填,长度为1-64个字符!'
    操作项'静态密码*:'失败,提示信息:'密码必填,长度4-32个字符!'
    操作项'确认静态密码*:'失败,提示信息:'确认密码必填,长度4-32个字符!'

    td[1]表示id=adminid这个元素上面倒数第一个td,即使用preceding-sibling时,是下往上看的,离adminid最近的为td[1];而使用following-sibling时,是上往下看的,注意顺序,可以看下面这个例子。

    例4:打印常用控件标题及内容

    HTML和页面如下:

    代码:

     1 def printInputInfo(driver, key_id, value, inputType=u'edit'):
     2     u'打印常用控件标题及内容'
     3     u'''
     4     args:
     5     key_id: 页面输入元素的ID
     6     value: 输入的值
     7     inputType:输入元素的类型
     8     '''
     9     #标题xpath
    10     xp = u"//*[@id='%s']/ancestor::td/preceding-sibling::td[1]" % key_id
    11     #取标题
    12     title = webApi.getTextBy(driver, by.xpath_(xp), 2)
    13     
    14     if inputType == u'edit':
    15         t = u'编辑框'
    16     elif inputType == u'select':
    17         t = u'下拉选择框'
    18     elif inputType == u'tree':
    19         t = u'树状选择器'
    20     elif inputType == u'radio':
    21         t = u'单选按钮'
    22     elif inputType == u'checkbox':
    23         t = u'复选框'
    24     print u"%s---%s %s" % (t, title.strip(), value)

    当程序执行到输入令牌号,会打印控件类型、标题、输入值,如 "编辑框---令牌号: 2600321700067"。

    此处使用preceding-sibling::td[1],若用td[3],则输出 "编辑框---组织机构: 2600321700067"。

  • 相关阅读:
    不懂不可耻,可耻的是每当遇到不懂的东西不是想办法去学去了解而是极力掩饰。
    在咱学校的论坛上看到的一句话,觉得……我们都在等待某个人,等到累了,就随便牵起某人的手,默默地走进礼...
    在Linux下用Virtualbox虚拟机安装Windows XP
    大学里的挂科是对考前三天不用功的惩罚.这是教算法的赵PZ讲的,窃以为很有道理。可是接下来的十一天里我...
    壮哥!才发现你博客里这么多好东西,慢慢欣赏了,哈哈~~~~~~~~~~
    哥们现在用的什么?ghs不是又被封了吗
    提取字符串中的数字并分别保存
    十一天八考之路
    WPF使ListBox支持手势多选功能
    动手实现扩展属性为对象动态添加获取数据(续)
  • 原文地址:https://www.cnblogs.com/testlife007/p/4263745.html
Copyright © 2011-2022 走看看