• 四、八大元素定位


    一、八大元素定位

    1. id
    2. name
    3. class_name
    4. tag_name
    5. link_text
    6. partial_link_text
    7. xpath
    8. css_selector

    1)id元素定位

    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    
    # 得到的返回值是一个WebElement的Python对象==》元素
    input_elem = driver.find_element_by_id("kw")
    print(input_elem)
    
    # 获取属性==》WebElement()
    print(input_elem.get_attribute("name"))
    # 在Python中不能直接修改元素,selenium没有封装对应的方法

    2)find_element 和 find_elements 

    一个查找一个,一个是查找多个

    前面得到的是一个WebElement对象,后面得到的是一个列表

    没有该定位时,前者报错NoSuchElementException,后者返回空列表

    # 判断元素是否存在
    if not driver.find_elements_by_id("kwkw"):
        print("该元素不存在")
    else:
        print("该元素存在")

    3)name属性定位

    # name属性
    driver.find_element_by_name("wd")
    driver.find_elements_by_name("wd")

    4)class_name属性

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

    5)link_text 通过超链接的全部文本

    e=driver.find_element_by_link_text("新闻")
    e.click()

    6)partial_link_text 通过超链接的部分文本

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

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

    7)tag_name属性 (定位元素太多,测试时不用,爬虫的时候用)

    driver.find_element_by_tag_name("input")

    用的最多的是id name class_name

    • id:唯一的

    • name:用户输入经常会带name属性(源代码按ctrl+f,查找元素)

    • class_name:因为也经常出现

    二、元素定位之入坑指南

    1)虽然id是唯一的,但是有些网页id是变化的

    2)不要用可能会动态变化的属性进行元素定位

        --不规则的字符串,一般会比较长

        --纯数字 ,22,53,23

        --带数字的,a2,kw1,kw3

    3)class_name值中间不能有空格(如class=" bg s_ipt_wr quickdelete-wrap")

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

        --复制表达式到浏览器,ctrl+f

        --find_elements只有一个元素 

    以上六种定位元素(通过单属性定位,只能定位特征明显的元素)

    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")

     三、xpath--组合多个特征,组合多个属性--

     Xpath:即XML路径语言(XML Path language),用来确定XML文档中某部分位置的语言

    1)获取xpath的表达式

    • 自己编写,第一顺位

    • 使用插件,第二顺位

    • 通过浏览器右击复制,第三顺位

    2)绝对定位 相对定位

    /:绝对路径(从最开始的地方一层一层进入对应的元素,冗余,容错性差)

    //:相对路径(已经在某个位置了,更加简洁,容错性更强)

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

    3)xpath表达式

    //*[@id="kw"]

    • *代表通配符,这里表示标签名称

    • [@id="kw"]谓语条件,@属性=多少

    组合多个条件://*[@id="kw" and @name="wd" and @class="s_ipt"]

    通过xpath定位新闻

    e= driver.find_element("xpath","//a[text()='新闻']")    # text不是属性,前面不加@

    通过xpath contains 定位新闻

    e =driver.find_element("xpath","//a[contains(text(),'新闻')]")
    e.click()
    # 通过祖先和父亲查找
    '''//span[@id = 's_kw_wrap']/input[@clas='s_ipt'] '''
    
    # 通过子元素找父元素,使用/..,不能跨级查找
    '''' //input[@clas='s_ipt']/../..'''
    
    # 特殊手段1(通过索引,索引是从1开始的)
    '''
    //input[1]
    (//input)[1] 加了括号提高了优先级
    '''

    4)轴定位

     

    哥哥、姐姐==preceding-sibling

    弟弟、妹妹==following-sibling

    祖先==ancestor (找到比他辈分大的直系,爷爷的同级不会显示) 

    如:

    通过input找同级span(同级哥哥)

    //input[@id="kw"]//preceding-sibling::span

    通过input找同级a标签(同级弟弟)

    //input[@id="kw"]//following-sibling::a

    input输入框的祖先

    //input[@id="kw"]//ancestor::span

    四、css选择器

    .s_ipt       class_name = s_ipt

    #kw         id = kw

    (.表示class   #表示id)

     css选择器:input[id=kw]  ===>xpath表达式: //input[@id="kw"]

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

    五、xpath和css

    --css的好处1:表达式方式更加简洁

    --css的好处2:主流浏览器,查询速度快

    --xpath的好处1:功能更强:支持更多的函数,查找父元素、轴运算

    --xpath的好处2:支持text文本定位,css不支持

    --xpath的好处3:对于一些复杂元素,xpath写法反而要简洁

  • 相关阅读:
    python之字符串【str】
    python之列表【list】
    python之os模块
    MySQL 模糊查询
    Dreamoon-Operating on a graph(并查集+链表)
    Dreamoon-Operation Love(凸包)
    CF1382D.Unmerge(背包)
    PAT-T1027 Larry and Inversions (树状数组)
    CF1379C.Choosing Flowers(二分)
    矩阵快速幂模板
  • 原文地址:https://www.cnblogs.com/zhangjx2457/p/13793087.html
Copyright © 2020-2023  润新知