zoukankan      html  css  js  c++  java
  • 31 Xpath复杂元素定位 find_element

    (67,68,69)

    目录

    一、python八大元素定位

    正文

    一、python八大元素定位方式

    id、name、class_name、tag_name、link_text、partial_link_text、xpath、css_selector

    1.元素定位

     得到的返回值是一个webelement的python对象.------》定位的元素,下面以百度页面的输入框为例:

    ① find_element_by_id("kw")

    input_elem=driver.find_elemrnt_by_id("kw")
    print(input_elem)  #webelement对象

    得到的结果就是一个webelement

    那么如何获取元素的属性?------就是获取webelement的属性,get_attribute()

    attr = input_elem.get_attribute("name")
    print(attr)

     注意:Python中,当前还不能直接修改元素,selenium没有封装对应的方法。

    ②find_element_by_id  VS find_elements_by_id

    find_element_by_id :

     1)查找一个,得到的是一个webelement对象;

     2)找不到元素的话,报错:NoSuchElementException

    find_elements_by_id :

    1).查找多个,得到一个列表

    2.查找不到元素的话,得到的是一个空列表

    在实际定位的时候,不知道该元素存不存在,可以用下面的判断方法:

    if not driver.find_elements_by_id("kk")
        print("该元素不存在")
    else:
        print("该元素存在")

    ③name属性定位---->find_element_by_name

    driver.find_element_by_name("wd")
    driver.find_elements_by_name("wd")

    ④class属性---->class_name

    driver.find_element_by_class_name("s_ipt")
    driver.find_elements_by_class_name("s_ipt")

    ⑤link_text :通过超链接的文本,进行元素定位(只能定位超链接,其他的元素是不能定位的,所以只能定位a标签)

    e = driver.find_element_by_link_text("新闻")
    e.click() #  如果定位成功,会点击进入新闻这个链接的页面

    ⑥partial_link_text:通过超链接的文本的一部分进行元素定位

    e = driver.find_element_by_partial_link_text("")
    e.click()

    注意:若果有多个新开头的超链接,永远定位到的都是第一个。

     ⑦tagname  ---->定位的元素比较多,测试的时候很少用

     driver.find_element_by_tagname("input")

    总结:以上6种定位方法,用的最多的是id、name、class_name用的最多

    id:是唯一的

    name:用户输入经常会带name属性(提前在浏览器中,F12,在源代码中,按ctrl+F,查找元素出现的次数)

    class_name:出现次数多

    元素定位的坑

    1.不要用可能会发生动态变化的属性进行元素定位。------->属性是静态的才能定位

    比如说:1)不规则的字符串(比较长可能是加密),就不能用这个属性进行元素定位

        2)有些属性有数字,纯数字的,不能用来定位

        3)带数字的,也要警惕

    2.class_name定位的时候,class_name值中间不能有空格-------》class是分组的

    下面定位百度,class_name的值中间有空格,是定位不到的

    class = "bg s_btn"表示2个class,用空格分开。

    所以通过class_name进行定位,只能写其中一个。

    driver.find_element_by_class_name("bg") 或者 driver.find_element_by_class_name("s_btn") 

     

     3.如何确定我的元素表达式只能找到一个元素

    1).复制表达式到浏览器,在F12的源码中ctrl+F

    2).find_element只有一个元素

    以上6种 元素定位的方式:通过单属性定位只能定位特征明显的元素。

    下面介绍xpath,css_selector--------面试题

    优势:组合多个特征、组合多个属性,能够更加精准的定位元素;定位元素的时候,因为可以组合,有更大的灵活性。

    面试题:八大元素定位有哪些?

    先说八种元素定位方式;再说,其实没有8种元素定位方式:find_element_by_id / by_name / by_tag_name / by class_name等都是在find_element()方法的基础上,进行二次封装的。其本质都是使用的find_element()方法,进行元素定位的。

    如下:find_element()方法的源码:

    driver.find_element("id","kw")    ==  driver.find_element_by_id("kw")

    即上面的语句是等价的。

     69节

    ⑦xpath

     1)定义:Xpath即XML路径语言(XML Path language),用来确定XML文档中某部分位置的语言。XML跟HTML很相像,所以也可以进行HTML

     2)使用xpath进行元素定位

         获取xpath的表达式:

        ------1.通过浏览器,F12定位,在源码上右击,copy--》copy xpath 、copy selector、copy full xpath (第三顺位)

        ------2.使用插件   (第二顺位)

        ------3.自己编写。(第一顺位,最重要)

    学习的时候:不要使用工具获取xpath,有时候是不正确的,一般最好是自己写。

    实际项目中,节省时间可以使用插件。

    3).绝对定位 相对定位

     绝对路径 VS 相对路径

    在自动化测试中,使用相对路径,不使用绝对路径。

    面试题:↓↓

    绝对路径:

       1)从最开始的位置,一层一层进入对应的元素。

       2)冗余,容错性更差

    相对路径:

       1)在某个位置,不需要从最开始的位置

     2) 更加简洁、灵活,容错性更好

    例如:前端工程师,喜欢加层级(多个div),使用绝对路径就很可能找不到元素。相对路径则比较灵活。容错性更好。

    3)xpath表达式 解释

    单个属性定位

    //*[@id = "kw"]  :查找任意的元素,这个元素的属性id=kw

    // :表示相对路径

    * :表示通配符,所有的标签名称 (上面的式子定位百度输入框,就等价于 //input[@id = "kw"])

    [@id="kw" ]:谓语条件   属性=值,@表示这个属性。@+属性。

    组合多个条件:如果一个属性定位不到,就考虑组合多个条件

    例如://input[@id= "kw" and name="wd" and class="s_ipt"]

    text()文本定位:文本不是属性,不能加@

    //a[text()="新闻”]

    xpath函数---contains包含    模糊匹配

    常用的语法:// *[contains(text() , " XXX")]

                         //*[contains(@id,"XX")]

    下面的情况就可以用contains进行过滤

     ---class可能有多个,有空格 《------(class属性定位,一定不能有空格)

     ----text()定位一部分

     ----有空格的情况

    举例:通过xpath定位 新闻 这个文本 

    e = driver.find_element("xpath",”//a[text() = "新闻“]“) #a标签
    e.click()

    上面的例子,通过contains进行元素定位(如果新闻两个字前后有空格,定位的时候不注意,只定位新闻二字,就定位不到,用contains进行过滤)

    e = driver.find_element("xpath",”//a[conatins(text() , "新闻“)]“)
    e.click()
    e = driver.find_element("xpath",”//a[conatins(text() , "新“)]“)
    e.click()

    定位的是属性

    e = driver.find_element("xpath",”//a[conatins(@id , "kw“)]“)
    e.click()

    祖级(//)、父级(/)查找子元素

    组合查找,还是定位不到元素,该怎么办?-----父级元素进行查找

    举例://span[@class="bg s_btn_wr" ]/*[@id="su"]

    层级之间加 / :表示父、子级关系

    层级之间加 // :表示祖孙关系(可以是儿子,孙子,曾孙、、、、、、后代)

    子元素查找父级元素---缺点,不能跨级定位,只能一级一级定位

    /../..定位上一级元素(不能跨级)

    //input[@id="kw"]/../..定位到爷爷级

    特殊手段定位元素

    手段1.通过索引查找,索引从1开始。并且索引前面加括号

    (//input[1])

    如果不加括号,会查找出3个索引为1的元素。

    70节

    手段2.轴定位 轴运算

     --1.灵活设计:子孙元素找祖先

     --2.可以找同胞(关系查找)

    轴定位表达式

     

     sibling: 当前节点的同胞(姐姐或者哥哥     弟弟或者妹妹)

    ※ preceding-sibling :当前节点的同胞,只是哥哥或者姐姐 (当前节点的前面)

    ※following-sibling:当前节点的同胞,只是弟弟或者妹妹 (当前节点的后面)

    ※ancestor: 祖先

    这三个轴运算,是xpath很难实现的,使用轴运算就很方便。

    举例:百度输入框input

    1.查找input元素的同胞节点(哥哥/姐姐)------->     //input[@id="kw"]//preceding-sibling::span

    如果直接写成    //input[@id="kw"]//sibling::span   是查找不到的,因为有同胞有input 前面的跟后面的

    2.查找input元素的同胞节点(弟弟/妹妹)------->  //input[@id="kw"]//following-sibling::span

    3.祖先 ,当前节点所有的外层元素(从父亲级开始查找,父亲级找不到再找爷爷级,只要是祖先级别,都可以找到)

    举例:input输入框的祖先----> //input[@id="kw"]//ancestor::span

    4.组合查找:父亲的同胞-------->  //input[@id="kw"]//ancestor::span//preceding-sibling::input

     ⑧ css_selector   css选择器

    css表达式

    1)css选择器的一般写法:input[id=kw] ------》对应的xpath的写法是//input[@id="kw"]

    css选择器的表达式,更加简洁(//,@,""都可以省略)

    2)一个点 . 表示class

    查找class_name = s_ipt,用css选择器来查找,就是.s_ipt

    3)#号:表示id

    查找id="kw" ,用css选择器来查找,就是 #kw,也可以直接写为input#kw

     

     

    css查找的单向性---只能通过父元素找子元素

    总结:

    xpath比之前的6种元素定位方式的优势:

    xpath可以进行组合:可以组合元素的标签、属性、text文本、上下级关系。

    //input[@id = "kd" and  text() = "新闻”]

    //div/input[@id = "kd" and  text() = "新闻”]     父级必须是div,父元素定位子元素

    //*[] 任意标签名

    //input[@*="kw"] *表示的是任意属性

    //input[@id] 有id属性,具体id值不知道也可以。爬虫(测试中条件要精确,这个表示方法基本不用)

    //input[contains(text(),"新闻“)]          //input[contains(@class,"value")]

    //input[@id= "kw"]/../..子元素找父元素

    xpath VS CSS----面试题

     css的优势: 

    1.表达方式更加简洁

    2.主流浏览器,查询速度快(毫秒级别的差别)

    xpath 的优势:

    1.功能更强,支持更多的函数,可以查找父元素、轴元素、(css只能用父元素找子元素)

    2.支持用text()文本定位查找的(css不支持)

    3.对于复杂的元素,xpath的写法反而比css简洁(支持跟多的函数、组合定位)

    在find_element()函数中,使用的是css选择器,而不是xpath的原因:查询速度快一点点。

    平时查找使用xpath,封装函数建议使用css_seletor.

  • 相关阅读:
    数据库连接字符串
    搭建消息队列
    Linux---江湖
    Bundle压缩JS和CSS
    DDD分层架构之仓储
    UI控件库
    图解Http协议 url长度限制
    JAVA jdbc(数据库连接池)学习笔记(转)
    领域驱动设计(DDD)部分核心概念的个人理解(转)
    怎样的中奖算法能让人信服(转)
  • 原文地址:https://www.cnblogs.com/ananmy/p/13323921.html
Copyright © 2011-2022 走看看