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
  • 相关阅读:
    December 23rd 2016 Week 52nd Friday
    December 22nd 2016 Week 52nd Thursday
    December 21st 2016 Week 52nd Wednesday
    December 20th 2016 Week 52nd Tuesday
    December 19th 2016 Week 52nd Sunday
    December 18th 2016 Week 52nd Sunday
    uva294(唯一分解定理)
    uva11624Fire!(bfs)
    fzu2150Fire Game(双起点bfs)
    poj3276Face The Right Way
  • 原文地址:https://www.cnblogs.com/gtea/p/12715776.html
Copyright © 2011-2022 走看看