• web页面元素定位


    所有web网页中有8种元素定位方式

    靠单一的特征找元素:6种(id,class_name,tag_name,name,link_text(2))
    组合各种特征和关系来找元素:2种(xpath,css)

    以下4种方法对所有元素可用

    1.id:唯一,id不变时首选它。

    # 一个元素有很多属性时,元素定位优先级首先是id,但id有时是变的,如果id是不变的,可用它来定位。
    # 如果id是变化/动态的,那么要舍弃id定位方式,换别的。
    # 以百度首页为例:
    # 这里定位策略是id,定位表达式是id="kw"。
    ele = driver.find_element_by_id("kw")  
    # 元素有属性+操作-----返回的是webElement对象(所以selenume中对元素是做了一层封装的)
    # driver所有的查找方法都是find_element开头,所有的查找结果都是webElement。
    # id在web网页中只会找到一个元素,所以只有一个对象可以返回.
    # 如果找到的是多个,须纠正开发.
    print(ele)

    2.标签名称 tag_name:可以找到一个或多个,不唯一,所以查找方法都一样。

    ele = driver.find_element_by_tag_name("input")   # 在DOM/html中匹配到的第一个元素
    print(ele)

    eles = driver.find_elements_by_tag_name("input")   # 多个,返回的是列表,元素为webElement对象,页面中全部匹配的元素.
    # 按整个html页面从上到下一层层找
    print(eles)

    3.class_name(不唯一):同上。

    ele1 = driver.find_element_by_class_name("")
    print(ele1)

    ele2 = driver.find_elements_by_class_name("")
    print(ele2)
     
     

    4.name(不唯一):同上。

    # 虽name很多时候重名,但尽可能不重名,每个人都有自己的一个名字,名义上不绝对唯一,但很多时候唯一性很高
    ele3 = driver.find_element_by_name
    print(ele1)
    
    ele4 = driver.find_elements_by_name
    print(ele1)

      

    a元素:两种方法

    5.完整匹配文本值

    driver.find_element_by_link_text("更多产品")  
    # a链接的文本必须是"更多产品"4个字   
    # 全量匹配,完全匹配 
    # 不是绝对唯一:一个页面中允许多个链接文本值是一样的     
    # 当前页面中,任何一个元素只要它的文本值是‘更多产品’,那就完全匹配.

    6.部分匹配/包含

    driver.find_elements_by_partial_link_text("产品")  
    # 只要a元素的文本内容中有"产品"两字,就符合要求.

    以上6种方法在使用时,可能有时候会找不到元素,或者找到了后面又变了。所以用xpath或css组合定位。

    7.xpath定位


    # 绝对定位:路径绝对(兼容差,过度依赖位置和继承关系)  从祖先开始到本身  以/开头  /父/子
    # 相对定位: 
    # 在整个html页面,逐个条件,找到唯一的元素。
    # 摆脱位置和继承关系,web自动化首选。
    # 按ctrl+f打开下面的输入框使用相对路径进行查找
    # 多个属性:通过逻辑运算and/or

     1>.以//开头,//标签名[@属性名=值]     如果标签名是*,匹配所有标签。

    //input[@id="kw"]  # 找属性id,值为kw的元素

    2>.多个属性:通过逻辑运算and/or

    //*[@id="kw" and @name="wd" and @class="s_ipt"]  # 同时满足
    //*[@id="kw" or @name="wd" or @class="s_ipt"] # 满足其中一个

    3>.通过元素的文本内容来定位---文本内容固定才可用----函数  //标签名[text()=对应的文本值]

    //p[text()="平均出勤率"]

    4>.包含:属性/文本内容包含一部分即可-----//标签名[contains(@属性/text(),被包含的内容)]

    # 属性包含方式:
    //span[contains(@class,"quickdelete-wrap")]
    # 文本包含方式: //h1[contains(text(),"第2期")]
    # 包含与逻辑and/or相结合 //h1[contains(text(),"第2期") and @id="ccc"]

    5>.层级定位: 

    # 通过父辈/祖先辈
    # 以百度首页为例:
    # 定位登录元素
    # 它是一个a链接,有链接地址,有name/class/onclick属性,文本内容。
    # 首选name属性定位  
    //a[@name="tj_login"]
    # 会出现两个元素,不知道是哪个,可以将鼠标分别放在两个黄色部分,会显示定位路径/元素特征的就是要找的元素。

    两个元素一模一样,靠它自己本身根本找不到。

    用find elements找到所有匹配的元素,然后通过下标取值。

    两个一模一样分不清,可能爹/祖先不一样。

    通过父辈/祖先辈,先找到不一样的先辈,在先辈下面再找。------层级定位

    # 通过父辈找元素: 
    # /只能跟直系后代(会限制前后关系:父/子)
    # //只要是后代就行
    //div[@id="u1"]/a[@name="tj_login"] 

    6>.轴定位:多用于表格

    已知元素/轴名称::标签名称[@属性=值]

    轴运算:

    ancestor:祖先结点,包括父。

    parent:父结点

    preceding:当前元素节点标签之前的所有结点。(html页面先后顺序)

    preceding-sibling:当前元素节点标签之前的所有兄弟结点。

    following:当前元素节点标签之后的所有结点。(html页面先后顺序)

    following-sibling:当前元素节点标签之后的所有兄弟结点。

     

    8.css定位


  • 相关阅读:
    pdf 转图片,提取图片研究心得
    自己总结 C++ 代码规范
    Sublime Text 配置记录
    iOS控制器之基类设计
    SublimeText配置NodeJS代码提示
    YYCache设计思路及源码学习
    关于近期项目代码整理(iOS)
    iOS中iconfont(图标字体)的基本使用
    容器转场动画
    Xcode7 模拟器安装app (转)
  • 原文地址:https://www.cnblogs.com/xcc-/p/11504674.html
Copyright © 2020-2023  润新知