zoukankan      html  css  js  c++  java
  • 【Selenium学习】元素定位

    18种定位

    Selenium的定位方式一共有18种,单数8种,复数8种,最后两种是前面这16种的底层封装

    单数形式8种

    复制代码
     1 # 1、id定位
     2 al = driver.find_element_by_id('i1')
     3 al.send_keys('id定位')
     4 
     5 # 2、class定位
     6 bl = driver.find_element_by_class_name('classname')
     7 bl.send_keys('class定位')
     8 
     9 # 3、css selector定位
    10 cl = driver.find_element_by_css_selector('#i1')
    11 cl.send_keys('css selector定位')
    12 
    13 # 4、name定位:按照标签中的name属性定位
    14 dl = driver.find_element_by_name('name')
    15 dl.send_keys('name定位')
    16 
    17 # 5、link_text 文本内容定位
    18 import time
    19 time.sleep(1)
    20 driver.execute_script('window.scrollTo(0,0);')  # 跳转到网页的最上面
    21 time.sleep(1)
    22 el = driver.find_element_by_link_text('跳转大师兄博客地址')
    23 el.click()
    24 
    25 # 6、partial_link_text 模糊文本内容匹配
    26 import time
    27 time.sleep(1)
    28 driver.execute_script('window.scrollTo(0,0);')  # 跳转到网页的最上面
    29 time.sleep(1)
    30 fl = driver.find_element_by_partial_link_text('跳转')
    31 fl.click()
    32 
    33 # 7、Xpath 定位
    34 gl = driver.find_element_by_xpath('//input[@placeholder="请通过XPATH定位元素"]')
    35 gl.send_keys('xpath 定位')
    36 
    37 # 8、tag_name 标签名定位
    38 hl = driver.find_element_by_tag_name('input')
    39 hl.send_keys('tag_name 标签名定位')
    复制代码

    复数形式也是8种,是以上8种的复数形式,返回的是一个列表

    复制代码
     1 # 1、id定位
     2 als = driver.find_elements_by_id('i1')
     3 als[0].send_keys('id定位')
     4 
     5 # 2、class定位
     6 bls = driver.find_elements_by_class_name('classname')
     7 bls[0].send_keys('class定位')
     8 
     9 # 3、css selector定位
    10 cls = driver.find_elements_by_css_selector('input')
    11 cls[2].send_keys('定位到第三个input输入框')
    12 
    13 # 4、name定位:按照标签中的name属性定位
    14 dls = driver.find_elements_by_name('name')
    15 dls[0].send_keys('name定位')
    16 
    17 # 5、link_text 文本内容定位
    18 import time
    19 time.sleep(1)
    20 driver.execute_script('window.scrollTo(0,0);')  # 跳转到网页的最上面
    21 time.sleep(1)
    22 els = driver.find_elements_by_link_text('跳转大师兄博客地址')
    23 els[0].click()
    24 
    25 # 6、partial_link_text 模糊文本内容匹配
    26 import time
    27 time.sleep(1)
    28 driver.execute_script('window.scrollTo(0,0)')  # 跳转到网页的最上面
    29 time.sleep(1)
    30 fls = driver.find_elements_by_partial_link_text('示例')
    31 fls[0].click()
    32 
    33 # 7、Xpath 定位
    34 gls = driver.find_elements_by_xpath('//input')
    35 gls[4].send_keys('xpath 定位')
    36 
    37 # 8、tag_name 标签名定位
    38 hls = driver.find_elements_by_tag_name('input')
    39 hls[5].send_keys('tag_name 标签名定位')
    复制代码

    最后两种是前面16种的底层封装

    1 driver.find_element('id','i1')
    2 driver.find_elements('xpath','//input')

    以上两种定位方式,第一个参数填入下面8个字符串,分别对应上面的16种定位方式,单数和复数分别对应

    复制代码
    1 "id"
    2 "xpath"
    3 "link text"
    4 "partial link text"
    5 "name"
    6 "tag name"
    7 "class name"
    8 "css selector"
    复制代码

    下面举例说明:

    复制代码
     1 ali = driver.find_element('id','i1')
     2 ali.send_keys('xxxx')
     3 # 相当于:
     4 al = driver.find_element_by_id('i1')
     5 al.send_keys('xxxx')
     6 
     7 bls = driver.find_elements('css selector','input')
     8 bls[1].send_keys('css selector')
     9 # 相当于:
    10 bl = driver.find_elements_by_css_selector('input')
    11 bl[1].send_keys('css selector')
    复制代码

    总结:

      我们工作当中应该优先使用Css Selector定位,如果定位不到再用Xpath定位。因为查看源代码发现:使用id、name、tag name、class name定位,都会转换成css selector定位,具体源代码如下:

    复制代码
     1     def find_element(self, by=By.ID, value=None):
     2         if self.w3c:
     3             if by == By.ID:
     4                 by = By.CSS_SELECTOR
     5                 value = '[id="%s"]' % value
     6             elif by == By.TAG_NAME:
     7                 by = By.CSS_SELECTOR
     8             elif by == By.CLASS_NAME:
     9                 by = By.CSS_SELECTOR
    10                 value = ".%s" % value
    11             elif by == By.NAME:
    12                 by = By.CSS_SELECTOR
    13                 value = '[name="%s"]' % value
    14         return self.execute(Command.FIND_ELEMENT, {
    15             'using': by,
    16             'value': value})['value']
    17 
    18     def find_elements(self, by=By.ID, value=None):
    19         if self.w3c:
    20             if by == By.ID:
    21                 by = By.CSS_SELECTOR
    22                 value = '[id="%s"]' % value
    23             elif by == By.TAG_NAME:
    24                 by = By.CSS_SELECTOR
    25             elif by == By.CLASS_NAME:
    26                 by = By.CSS_SELECTOR
    27                 value = ".%s" % value
    28             elif by == By.NAME:
    29                 by = By.CSS_SELECTOR
    30                 value = '[name="%s"]' % value
    31         return self.execute(Command.FIND_ELEMENTS, {
    32             'using': by,
    33             'value': value})['value'] or []
    复制代码

    Xpath详细

    一、什么是Xpath

    XPath是XML的路径语言,通俗一点讲就是通过元素的路径来查找到这个标签元素。

    工具

    Xpath的练习建议大家安装火狐浏览器后,下载插件,FireBug。由于最新版火狐不再支持FireBug等开发工具,可以通过https://ftp.mozilla.org/pub/firefox/releases/ 下载49版本以下的火狐就可以增加Firebug等扩展了。

    二、Xpath的使用方法

    注:默认死格式 先写 //* 代表定位页面下所有元素

    1、Xpath通过标签的属性定位

    复制代码
     1 @代表以属性定位,后面可以接标签中任意属性
     2 通过ID定位
     3 //*[@id='i1']
     4 
     5 通过Class定位
     6 //*[@class='pg-header']
     7 
     8 通过Name定位
     9 //*[@name='username']
    10 
    11 通过Type定位
    12 //*[@ type='button']
    复制代码

    2、当标签的属性重合时,Xpath提供了通过标签来进行过滤

    复制代码
    1 获取所有input标签元素
    2 //input
    3 
    4 获取placeholder='用户名'的input标签元素
    5 //input[@placeholder='用户名']   这种方式比//*要快
    6 
    7 当出现重复时可以使用下标定位,从1开始
    8 //div[@class='inner'][2] 
    复制代码

    3、当标签页重复时,Xpath提供了层级过滤

    例如:找不到儿子,那么就先找他的爸爸,实在不行可以在找他的爷爷

    1 支持通过 / 进行层级递进,找到符合层级关系的标签
    2 //form/div/input[@placeholder="用户名"]
    3 
    4 当层级都重复时,可以通过单个层级的属性进行定位
    5 //form/div[@class='login-user']/input

    4、一个元素它的兄弟元素跟它的标签一样,这时候无法通过层级定位到。Xpath提供了索引过滤

    1 通过索引,在List中定位属性,与python的索引有些差别,Xpath从1开始
    2 //select[@name='city'][1]/option[1]

    5、上面集中如果都用上了之后还重复的话,我们就可以使用Xpath提供的终极神器,逻辑运算定位:and和or

    通过and来缩小过滤的范围,只有条件都符合时才能定位到
    //select[@name='city' and @size='4' and @multiple="multiple"]
    
    or就相反了,只要这些筛选中,其中一个出现那么久匹配到了
    //select[@name='city' or @size='4']

     Css Selector详细

    一、什么是Css Selector

      Css Selector定位实际就是HTML的Css选择器的标签定位

    工具

      Css Selector的练习建议大家安装火狐浏览器后,下载插件,FireFinder 或 FireBug和FirePath组合使用。

    二、Css Selector使用方法

    1、通过ID、Class定位

    复制代码
    1 ID定位
    2 #号代表id,定位有id的标签方式更加简洁
    3 #i1
    4 
    5 Class定位
    6 .代表Class
    7 .c1
    8 Class定位还提供了多个Class定位,通过连续.来缩小范围
    9 .c1.c2.c3
    复制代码

    2、通过标签定位

    1 定位方式 :直接输入标签名称
    2 div
    3 input
    4 单独用没什么作用,因为一个页面相同的标签太多了,需要和其他方式组合起来用

    3、通过属性定位

    1 属性定位方式,直接中括号,加上属性就可以了 
    2     [name='n1']

    4、通过标签属性组合定位

    复制代码
    1 标签属性组合
    2 input[name='n1']
    3 
    4 标签与Class组合
    5 input.c1
    6 
    7 标签与ID组合
    8 input#i1
    复制代码

    5、通过多属性组合

    1 Css Selector 的多属性组合选择过滤 没有and 只需要多个[] 连接 就可以
    2 select[name='city'][size='4'][multiple="multiple"]

    6、通过层级关系定位

    1 与Xpath的不同 Css Selector通过 > 来区分层级的界定
    2 select>option[value='3']

    7、模糊匹配

    复制代码
    1 ^= 匹配元素属性以什么开头
    2 [placeholder^='请输入']
    3 
    4 $= 匹配属性以什么结尾
    5 [placeholder$='元素']
    6 
    7 *= 匹配属性包含什么值 input
    8 [placeholder*='ID']
    复制代码
    作者:gtea 博客地址:https://www.cnblogs.com/gtea
  • 相关阅读:
    15款精美的 WordPress 电子商务网站模板
    15套免费的扁平化界面设计素材【免费下载】
    35幅使用小图片组成的创意插图作品 【上篇】
    sqlserver2014两台不同服务器上数据库同步
    C++ Reflection Library
    美国的包容主要体现在接受移民,那么,中国的包容主要体现在哪里呢?答案就是资本
    mysql主从复制
    Kubernetes+Istio
    Net异步编程
    研发的困境----DEVOPS
  • 原文地址:https://www.cnblogs.com/gtea/p/12715776.html
Copyright © 2011-2022 走看看