Selenium + Python 自学笔记(第十天)元素定位

WebDriver API
 
webdriver api 可以用来操作浏览器元素的类和方法
可以参考百度首页,页面上有输入框,按钮文字链接图片元素等,自动化测试就是要模拟鼠标和键盘来操作这些元素,如点击,输入,鼠标悬停等,而这些元素我们要提前定位他的自动化测试代码无法像人眼分辨页面上的元素,那么我们如何做元素定位呢
通过Chmore浏览自带的开发者工具我们可以看到元素页面都是由HTML代码组成的他们之间有层级的组织起来没个元素有不同的标签名和属性值webdriver就是根据这些信息来定位元素的webdriver 中提供了八种元素定位的方法在Python中对应的方法如下
find_element_by_id()   id定位
find_element_by_name()   name定位
find_element_by_tag_name()  tag定位
find_element_by_class_name()  class定位
find_element_by_link_text()  link_text定位
find_element_by_xpath()  Xpath定位
find_element_by_css_selector()  CSS_selector定位
 
 
可以复制百度首页代码
他们由这样的结构组成
<html></html>
<body></body>
<div></div>
<from></from>
html和div是标签的签名
<div id ="head" class ="s_down">
<from class="well">
<input id ="kw" name="wd" class="s_ipt">
就像人也有很多属性一样 如身份证号码id, 姓名name, 等
标签对之间可以有文本属性
<a>新闻</a>
<a>hao123</a>
<a>地图</a>
标签有层级关系
    <html>
        <body>
        </body>
    </html>
    <div>
        <from>
            <input />
        </from>
    </div>
对于上面结构如果可以吧input看做子标签,那么from就是他的父标签    
理解上面的特性是学习定位方法的基础我们可以以百度的输入框和搜索框未案例学士他们的不同使用方法查看百度的输入框和搜索框如下
<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
 
<input type="submit" id="su" value="百度一下" class="bg s_btn">
可以吧上面的元素看做是人呢怎么在现实世界中找到人呢首先可以通过人的属性来查找例如他的身份证号码,手机号码,姓名等,这些都是区别于他人的点,在Web页面上元素也有本身的属性 例如 id  name  class name  tag name 等。其次可以通过位置进行查找例如 x国 x省 x市 x号 。Xpath Css可以通过标签层级的关系来进行查找元素。最后还以通过相关人的属性来进行查找例如 找到他身边的人Xpath 和CSS同样提供了相似的定位策略来查找元素
理解了这些规则后下面介绍几种元素定位的方法几很好理解了
HTML的规则,id在HTML中必须是唯一的,这类似于我们的身证件,具有唯一性,WebDriver提供的id定位方法id定位方法来定位元素的id通过id定位百度的搜索框个搜索按钮用法如下
id定位
find_element_by_id("kw")
find_element_by_id("su")
find_element_by_id()    方法是来定位id的
Html规则,name是是用来指定元素的名称,因此他的作用更像是人的姓名通过name定位百度输入框如下
name定位
find_element_by_name("wd")
find_element_by_name()通过name来定位元素
class定位
Html规则,class用来置顶元素的类名,其用法与id,name类似,通过class来定位百度输入框如下。
find_element_by_class("a_pit")
find_element_by_class()    方法通过class来定位元素的
tag定位
HTML通过tag来定义不同页面的元素,例如<input>一般用来定义输入框,<a>标签用来定义超链接等,不过因为一个标签往往用来定义一类功能,所有通过标签来识别某一个元素的概率很低,例如我们打开任意一个页面查看前端代码一般都会发现大量的<div>,<input>,<a>等标签
通过tag name 定位百度输入框如下
find_element_by_tag_name("input") 
find_element_by_tag_name()    通过元素的标签来定位元素
link定位  
link定位与前面介绍的几种定位方法有所不同他专门用来定义文本链接,百度输入框上的文本链接如下
<a href=" http://news.baidu.com" name="tj_trnews" class="mnav">新闻</a>
<a href=" https://www.hao123.com" name="tj_trhao123" class="mnav">hao123</a>
<a href=" http://map.baidu.com" name="tj_trmap" class="mnav">地图</a>
<a href=" http://v.baidu.com" name="tj_trvideo" class="mnav">视频</a>
<a href=" http://tieba.baidu.com" name="tj_trtieba" class="mnav">贴吧</a>
<a href=" http://xueshu.baidu.com" name="tj_trxueshu" class="mnav">学术</a>
查看diam我们可以发现 用name定位是个不错的方法,为了掩饰link定位定位的使用,先给出link定位链接方法如下
find_element_by_link_text("新闻")
find_element_by_link_text("hao123")
find_element_by_link_text("地图")
find_element_by_link_text("视频")
find_element_by_link_text("贴吧")
find_element_by_link_text("学术")
find_element_by_link_text()    是通过元素标签对之间的文本信息来定位元素的
partial link定位
partial link 是最link的一个补充,有些文字链接比较长这个时候呢我们可以去文字链接的部分文字进行定位,只要这部分文字可以位移标识这个链接就可以
<a href=" http://xueshu.baidu.com" name="tj_trxueshu" class="mnav">一个很长的文本链接</a>
通过partial link定位方法如下
find_element_by_partial_link_text("一个很长的")
find_element_by_partial_link_text("文本链接")
find_element_by_partial_link_text()是通过元素标签对之间的部分文字来进行定位元素的
前面介绍的几种元素定位方法相对来说是简单的,在理想状态下每一个元素都有唯一标识id和name,我们可以通过他来进行定位元素,但是实际项目中并非想象的那么美好,有的时候一个元素斗没有id和name,或者页面上的多个元素是相同的又或者是随机变换的,在这种情况下我们要如何去定位呢。
下面我们介绍Xpath和CSS定位,与前面介绍的元素定位相比,他们提供了更加灵活的定位策略,可以通过不同的方式来进行定位我们想要的元素
Xpath定位
在HTML文档中,Xpath是一种元素定位语言。因为HTML可以看做XML的一种实现,所以WebDriver提供了这种在Web应用中定位元素的方法
    1.绝对的路径
        Xpath有很多种定位策略,最简单是就是直接写出元素的绝对路径,如果把元素看成个人,假设这个人没有任何的属性特征例如身份证,           姓名手机号等,但是这个人一定存在于某个位置某省某市某区某路某号,对于页面上的元素而言也有这样的有个路径
        find_element_by_xpath("/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]")
        find_element_by_xpath()是通过xpath来定位元素的,这里主要用标签名的层级关系来定位元素的绝对路径,最外层为HTML在body文           本内一层一层往下找,如果一个层级下有多个相同的标签,那么久按上下顺序确定是第几个,例如 div[2]表示当前层级下第二个div标签
    2.利用元素属性来定位
        除了使用绝对路径外,Xpath还可以使用元素的属性值来进行定位
        find_element_by_xpath("//input[@id="kw"]")
        find_element_by_xpath("//inpur[@id="su"]")
        //input表示当前页面某个input标签,[id="kw"] 表示这个元素的id值是kw下面通过name和class来定位
        find_element_by_xpath("//*[@name="kw"]")
        find_element_by_xpath("//*[@class="s_ipt"]")
        如果不想指定标签名可以用*来代替当然使用xpath不限于定位id,name,class这三个属性值,元素的任意属性都可以使用,只要他能唯一标识            一个元素
        find_element_by_xpath("'//input[@maxlength="100"]")
        find_element_by_xpath("//input[@autocomplete="off"]")
        find_element_by_xpath("//input[@type="submit"]")
      3.层级与属性结合
        如果元素本身没有唯一这个元素的属性值,那么我们可以查找上一级元素,如果上一级元素有唯一标识的属性,就可以拿来使用参考百度
        <from id="from" class="fm" action="/s" name="f">
            <span class="s_ipt_wr">
                <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
            </apsn>
            <span class="s_btn_wr">
                <input type="submit" id="su" value="百度一下" class="bg s_btn">
            </span>
 
        假如百度输入框没有任何利用的属性值,那么可以查找他的上一级属性例如小明刚出生的时候没有名字,也没有身份证号,如果要找到小明           就要先找到小明的家长,因为他家长是有很多属性的,找到小明的家长就可以找到小明通过Xpath描述如下:
        find_element_by_xpath("//span[@class="s_ipt_wr"]/input")
        span class="s_ipt_wr"通过class定位到父元素,后面/input表示父元素下面的子元素,如果父元素也没有可利用的元素,那么可以继续向上            进行查找
 
        find_element_by_xpath(//from[@id="from"]/span/input)
        find_element_by_xpath(//from[@id="from"]/span[2]/input)
        我们可以通过这种方法一级一级的向上查找,直到找到最外层的<html>标签,那样就是一个绝对路径的写法了。
 
        4.使用逻辑运算符
         1.如果一个属性不能唯一区分一个元素,那么我们可以使用逻辑运算符连接多个属性来进行查找元素
            find_element_by_xpath("//input[@id="kw" and @class="s_ipt]"")
            and必须满足两个条件来定位元素
 
         5.使用contains方法
            contains方法用于匹配一个属性中包含的字符串,例如span 标签的class属性为 s_ipt_wr
            find_element_by_xpath("//span[contains(@class,'s_ipt_wr')]/input")
            contains方法只获取了class属性中的 s_ipt_wr 部分
        6.使用text方法
            text()方法用于匹配显示文本信息,例如,前面通过 link text定位的文本链接
            find_element_by_xpath("//a[text(),'新闻']")
            contains和text配合使用
            find_element_by_xpath("//a[contains(text(),'一个很长的')]")
            他实现了partial link定位效果
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值