当前位置 博文首页 > 繁华似锦Fighting:『心善渊』Selenium3.0基础 — 7、XPath轴定

    繁华似锦Fighting:『心善渊』Selenium3.0基础 — 7、XPath轴定

    作者:繁华似锦Fighting 时间:2021-06-29 08:57

    目录
    • 1、XPath轴定位介绍
    • 2、位置路径表达式概念
    • 3、步的路径表达式范例
    • 4、练习

    使用XPath轴方式,可根据文档中元素的相对位置,来进行元素的定位。例如:先找到一个相对好定位的元素,在根据与它的相对位置来定位其他元素,可以解决一些元素难以定位的问题。

    1、XPath轴定位介绍

    轴可理解为相对于当前节点的节点集。

    轴名称 结果
    ancestor 选取当前节点的所有先辈(父、祖父等)。
    ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身。
    attribute 选取当前节点的所有属性。
    child 选取当前节点的所有子元素。
    descendant 选取当前节点的所有后代元素(子、孙等)。
    descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
    following 选取文档中当前节点的结束标签之后的所有节点。
    namespace 选取当前节点的所有命名空间节点。
    parent 选取当前节点的父节点。
    preceding 选取文档中当前节点的开始标签之前的所有节点。
    preceding-sibling 选取当前节点之前的所有同级节点。
    self 选取当前节点。

    2、位置路径表达式概念

    位置路径可以是绝对的,也可以是相对的。

    绝对路径起始于正斜杠(/),而相对路径不会这样。

    在两种情况中,位置路径均包括一个或多个步,每个步均被斜杠分割:

    (1)绝对位置路径

    /step/step/...
    

    (2)相对位置路径

    //step/step/...
    

    每个步均根据当前节点集之中的节点来进行计算。

    (3)步(step)包括

    • 轴(axis):定义所选节点与当前节点之间的树关系(如上表)。
    • 节点测试(node-test):识别某个轴内部的节点(相当于标签节点或者标签节点集)。
    • 零个或者更多谓语(predicate):索引。

    (4)步的语法

    轴名称::节点测试[索引]
    

    3、步的路径表达式范例

    例子 结果
    child::book 选取所有属于当前节点的子元素的 book 节点。
    attribute::lang 选取当前节点的 lang 属性。
    child::* 选取当前节点的所有子元素。
    attribute::* 选取当前节点的所有属性。
    child::text() 选取当前节点的所有文本子节点。
    child::node() 选取当前节点的所有子节点。
    descendant::book 选取当前节点的所有 book 后代。
    ancestor::book 选择当前节点的所有 book 先辈。
    ancestor-or-self::book 选取当前节点的所有 book 先辈以及当前节点(如果此节点是 book 节点)
    child::*/child::price 选取当前节点的所有 price 孙节点。

    4、练习

    页面代码片段

    <!DOCTYPE html>
    <html lang="zh-cn">
    <body>
    <div >
        <legend>注册用户A</legend>
        <p >
            <label for="userA">账号A</label>
            <input type="textA" name="userA"   placeholder="账号A" required="" value="">
        </p>
        <p>
            <label for="password">密码A</label>
            <input type="password" name="passwordA"  placeholder="密码A" value="">
        </p>
        <p><a href="http://www.sina.com.cn" >访问 新浪 网站</a></p>
        <input type="emailA" name="emailA"  placeholder="电子邮箱A" value="">
    </div>
    </body>
    </html>
    

    代码脚本

    """
    1.学习目标:
        必须掌握selenium中轴定位方法
    2.语法
        2.1 选择当前元素之后的同级元素
            语法://A/following-sibling::B
            说明:选择所有 A 元素之后同级的 B 元素。
        2.2 选择当前元素之前的同级元素
            语法://A/preceding-sibling::B
            说明:选择所有 A 元素之前同级的 B 元素。
        2.3 其他的轴定位关键字,可自己拓展练习。
    3.需求
        在页面中,定位指定元素。
    """
    # 1.导入selenium
    from selenium import webdriver
    from time import sleep
    import os
    
    # 2.打开浏览器
    driver = webdriver.Chrome()
    
    # 3.打开注册A页面
    url = "file:///" + os.path.abspath("./1.html")
    driver.get(url)
    
    # 4.定位页面指定元素
    # 4.1 选择当前元素之后的同级元素
    # 选择所有<legend>标签之后的同级的<p>元素
    elements_1 = driver.find_elements_by_xpath("//legend/following-sibling::p")
    for element in elements_1:
        print(element.get_attribute("outerHTML"))
    
    # 4.2 选择当前元素之前的同级元素
    # 选择所有<input>之前的同级的<p>元素
    elements_2 = driver.find_elements_by_xpath("//input/preceding-sibling::p")
    for element in elements_2:
        print(element.get_attribute("outerHTML"))
    
    
    # 5.关闭浏览器
    sleep(2)
    driver.quit()
    """
    输出结果:
    打印两次如下内容
    <p >
        <label for="userA">账号A</label>
        <input type="textA" name="userA"   placeholder="账号A" required="" value="">
    </p>
    <p>
        <label for="password">密码A</label>
        <input type="password" name="passwordA"  placeholder="密码A" value="">
    </p>
    <p><a href="http://www.sina.com.cn" >访问 新浪 网站</a></p>
    """
    
    bk
    下一篇:没有了