zoukankan      html  css  js  c++  java
  • 4.1 selenium元素定位

    通过前端工具,我们看可以看到页面上的元素都是由一行一行的代码组成。它们之间有层级的组织起
    来,每个元素有不同的标签名和属性值。那么在 Selenium 当中就是通过这信息来找到不同的元素的。
    webdriver 提供了八种元素定位方法:
     id
     name
     class name
     tag name
     link text
     partial link text
     xpath
     css selector
    在 Python 语言中对应的定位方法如下:
    find_element_by_id()
    find_element_by_name()
    find_element_by_class_name()
    find_element_by_tag_name()
    find_element_by_link_text()
    find_element_by_partial_link_text()
    find_element_by_xpath()
    find_element_by_css_selector()

    下面我们就逐一的来看这些定位方法的使用。在此之前,我们拷取百度首页的前端代码,以定位页面

     1 <html>
     2 <head>
     3 <body>
     4 <script>
     5 <div id="wrapper" style="display: block;">
     6 <div id="debug" style="display:block;position:..">
     7 <script>
     8 <div id="head" class="s_down">
     9 <div class="head_wrapper">
    10 <div class="s_form">
    11 <div class="s_form_wrapper">
    12 <div id="lg">
    13 <a id="result_logo" onmousedown="return .." href="/">
    14 <form id="form" class="fm" action="/s" name="f">
    15 <input type="hidden" value="utf-8" name="ie">
    16 <input type="hidden" value="8" name="f">
    17 <input type="hidden" value="1" name="rsv_bp">
    18 <input type="hidden" value="1" name="rsv_idx">
    19 <input type="hidden" value="" name="ch">
    20 <input type="hidden" value="02.." name="tn">
    21 <input type="hidden" value="" name="bar">
    22 <span class="bg s_ipt_wr">
    23 <input id="kw" class="s_ipt" autocomplete="off"
    24 maxlength="100" value="" name="wd">
    25 </span>
    26 <span class="bg s_btn_wr">
    27 <input id="su" class="bg s_btn" type="submit"
    28 value="百度一下">
    29 </span>
    30 ....
    31 </body>
    32 </html>hello
    baidu.html

    4.1.1 id 定位
    name 如果把页面上看元素看作一个人的话,如果我们想找一个人如何去找,那么这个人一定有其别于
    其它人的“属性”,比如他的身份证号一定和别人不一样,他的名字和别人不一样。那么我们就可以通过
    身证号和名字来找到一个人。那么 id 就可以看做是一个人的身份号,当然这个 id 并不像我们现实中的身
    份证号有那么强的唯一性,如果在一个页面上发现有两个元素的 id="kw"也是不足为奇的,这个取决前端
    代码的规范程度。
    对百度首页上的输入框与百度搜索按钮来说,定位方法如下:
    find_element_by_id("kw")
    find_element_by_id("su")
    find_element_by_id()方法用于元素中 id 属性的定位。


    4.1.2 name 定位

    name 的定位与 id 类似,每一个人都会有名字,那么 name 就可作是一个元素的名字。通过 name 定位

    输入框:
    find_element_by_name("wd")
    find_element_by_name()方法用于元素中 name 属性的定位,百度搜索按钮并没有提供 name 属性,那
    么我们就不能通过 name 去定位百度搜索按钮。


    4.1.3 class 定位
    class 也是不少元素会有的一个属性,它的定位和 name 以及 id 类似,下面通过 class 去定位百度输入
    狂和百度搜索按钮:
    find_element_by_class_name("s_ipt")
    find_element_by_class_name("bg s_btn")
    find_element_by_class_name()方法用于元素中 class 属性的定位。


    4.1.4 tag 定位
    tag 定位取的是一个元素的标签名,通过标签名去定位单个元素的唯一性最底,因为在一个页面中有
    《Selenium2 Python 自动化测试实战》样张
    63
    太多的元素标签为<div>和<input>了,所以很难通过标签名去区分不同的元素。
    通过标签名定位百度首页上的输入框与百度搜索按钮:
    find_element_by_tag_name("input")
    find_element_by_tag_name("input")
    find_element_by_tag_name()方法通过元素的 tag name 来定位元素。通过上面的例子,我们并不能区别
    不同的元素,因为在一个页面上标签名相同很难以避免。


    4.1.5 link 定位
    link 定位与前面介绍的几种定位方法有所不同,它专门用来定位本链接。百度输入框上面的几个文本
    链接的代码如下:
    <a class="mnav" name="tj_trnews" href="http://news.baidu.com">新闻</a>
    <a class="mnav" name="tj_trhao123" href="http://www.hao123.com">hao123</a>
    <a class="mnav" name="tj_trmap" href="http://map.baidu.com">地图</a>
    <a class="mnav" name="tj_trvideo" href="http://v.baidu.com">视频</a>
    <a class="mnav" name="tj_trtieba" href="http://tieba.baidu.com">贴吧>
    通过查看上面的代码,我们发现通过 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()方法通过元素标签对之间的文本信息来定位元素。不过,需要强调的是
    Python 对于中文的支持并不好,如查 Python 在执行中文的地方出现在乱码,可以在中文件字符串的前面
    加个小“u”可以有效的避免乱码的问题,加 u 的作用是把中文字符串转换中 unicode 编码,如:
    find_element_by_link_text(u"新闻")

    4.1.6 partial link 定位
    parial link 定位是对 link 定们的一个种补充,有些文本连接会比较长,这个时候我们可以取文本链接的
    《Selenium2 Python 自动化测试实战》样张
    64
    有一部分定位,只要这一部分信息可以唯一的标识这个链接。
    <a class="mnav" name="tj_lang" href="#">一个很长很长的文本链接</a>
    通过 partial link 定位如下:
    find_element_by_partial_link_text("一个很长的")
    find_element_by_partial_link_text("文本连接")
    find_element_by_link_text()方法通过元素标签对之间的部分文本信息来定位元素。
    前面所介绍的几种定位方法相对来说比较简单,我们理想状态下在一个页面当中每一个元素都会有一
    个唯一 id 和 name 属性值,我们通过它的属性值来找到他们,但在实际的项目中并非想象的这般美好。有
    时候一个元素并没有 id 或 name 属性,或者会有多个元素的 id 和 name 属性值是一样的,又或者每一次刷
    新页面,id 的值都会随机变化。那么在这种情况下我们如何来定位元素呢?
    下面介绍 xpath 与 CSS 定位相比上面介绍的方式来说比较难理解,但他们的灵活的定位能力远比上
    面的几种方式要强大得多。


    4.1.7 XPath 定位
    XPath 是一种在 XML 文档中定位元素的语言。因为 HTML 可以看做 XML 的一种实现,所以 selenium
    用户可是使用这种强大语言在 web 应用中定位元素。
    绝对路径定位:
    XPath 有多种定位策略,最简单和直观的就是写元素的绝对路径。如果仍然把一个元素看做一个人的
    话,那么现在有一个人,他没有任何属性特征,那么这个人一定会存在于某个地理位置,如:xx 省 xx 市
    xx 区 xx 路 xx 号。那么对于一个元素在一个页面当中也会有这样的一个绝对地址。
    参考 baidu.html 前端工具所展示的代码,我们可以用下面的方式来找到百度输入框和搜索按钮。
    find_element_by_xpath("/html/body/div/div[2]/div/div/div/from/span/input")
    find_element_by_xpath("/html/body/div/div[2]/div/div/div/from/span[2]/input")
    find_element_by_xpath()方法用于 XPath 语言定位元素。XPath 的绝对路径主要用标签名的层级关系来
    定位元素的绝对路径。最外层为 html 语言,body 文本内,一级一级往下查找,如果一个层级下有多个相
    同的标签名,那么就按上下顺序确定是第几个,div[2]表示第二个 div 标签。

    利用元素属性定位:
    除了使用绝对路径的以外,XPath 也可以使用使素的属性值来定位。同样以百度输入框和搜索按钮为
    例了:
    find_element_by_xpath("//input[@id='kw']")

    4.1.8 CSS 定位
    CSS(Cascading Style Sheets)是一种语言,它被用来描述 HTML 和 XML 文档的表现。CSS 使用选择器
    来为页面元素绑定属性。这些选择器可以被 selenium 用作另外的定位策略。

    通过 class 属性定位:
    find_element_by_css_selector(".s_ipt")
    find_element_by_css_selector(".bg s_btn")
    find_element_by_css_selector()方法用于 CSS 语言定位元素,点号(.)表示通过 class 属性来定位元素。
    通过 id 属性定位:
    find_element_by_css_selector("#kw")
    find_element_by_css_selector("#su")
    井号(#)表示通过 id 属性来定位元素。
    通过标签名定位:
    find_element_by_css_selector("input")
    在 CSS 语言中用标签名定位元素不需要任何符号标识,直接使用标签名即可,但我们前面已经了解到
    标签名重复的概率非常大,所以通过这种方式很难唯一的标识一个元素。
    通过父子关系定位:
    find_element_by_css_selector("span>input")
    上面的写法表示有父亲元素,它的标签名叫 span,查找它的所有标签名叫 input 的子元素。
    通过属性定位:
    find_element_by_css_selector("input[autocomplete='off']")
    find_element_by_css_selector("input[maxlength='100']")
    find_element_by_css_selector("input[type='submit']")
    在 CSS 当中也可以使用元素的任意属性,只要这些属性可以唯一的标识这个元素。

  • 相关阅读:
    source is null for getProperty(null, "cpmodel")异常结局
    insert时报Cannot add or update a child row: a foreign key constraint fails (`yanchangzichan`.`productstatusrecord`, CONSTRAINT `p_cu` FOREIGN KEY (`cid`) REFERENCES `customer` (`cid`))错误
    Python流程控制
    Python运算符
    Python字符串格式化输出
    Python数据强制类型转换
    Python数据类型
    Python input函数使用
    Python print函数使用
    Python变量
  • 原文地址:https://www.cnblogs.com/mtfan01/p/9059511.html
Copyright © 2011-2022 走看看