zoukankan      html  css  js  c++  java
  • 4.8 定位一组元素

    在本章的第一节我们已经学习了 8 种定位方法,那 8 种定位方法是真对单元素定位的,WebDriver 还
    提供了与之对应的 8 种定位方法用于定位一组元素。
    find_elements_by_id()
    find_elements_by_name()
    find_elements_by_class_name()
    find_elements_by_tag_name()
    find_elements_by_link_text()
    find_elements_by_partial_link_text()
    find_elements_by_xpath()
    find_elements_by_css_selector()
    定位一组对象的方法与定位单个对象的方法类似,唯一的区别是在单词 element 后面多了一个 s 表示
    复数。定位一组对象一般用于以下场景:
     批量操作对象,比如将页面上所有的复选框都被勾选。

     先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。比如定位出页面上所有的
    checkbox,然后选择最后一个

     1 <html>
     2 <head>
     3 <meta http-equiv="content-type" content="text/html;charset=utf-8" />
     4 <title>Checkbox</title>
     5 <link href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css"
     6 rel="stylesheet" />
     7 <script
     8 src="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.js"></script>
     9 </head>
    10 <body>
    11 <h3>checkbox</h3>
    12 <div class="well">
    13 <form class="form-horizontal">
    14 <div class="control-group">
    15 <label class="control-label" for="c1">checkbox1</label>
    16 <div class="controls">
    17 <input type="checkbox" id="c1" />
    18 </div>
    19 </div>
    20 <div class="control-group">
    21 <label class="control-label" for="c2">checkbox2</label>
    22 <div class="controls">
    23 <input type="checkbox" id="c2" />
    24 </div>
    25 </div>
    26 <div class="control-group">
    27 <label class="control-label" for="c3">checkbox3</label>
    28 <div class="controls">
    29 <input type="checkbox" id="c3" />
    30 </div>
    31 </div>
    32 </form>
    33 </div>
    34 </body>
    35 </html>
    checkbox

    这里手动创建一个 checkbox.html 的页面,通过浏览器打开,效果如图。

    为了使页面更美观,在代码中添加了 bootstrap 在线样式的引用。下面就通过例子来操作页面上的这一
    组复选框。

     1 #coding=utf-8
     2 from selenium import webdriver
     3 import os
     4 driver = webdriver.Firefox()
     5 file_path = 'file:///' + os.path.abspath('checkbox.html')
     6 driver.get(file_path)
     7 # 选择页面上所有的 tag name 为 input 的元素
     8 inputs = driver.find_elements_by_tag_name('input')
     9 #然后从中过滤出 tpye 为 checkbox 的元素,单击勾选
    10 for i in inputs:
    11 if i.get_attribute('type') == 'checkbox':
    12 i.click()
    13 driver.quit()
    checkbox

    前面在提到通过 tag name 的定位方式很难定位到单个元素,因为元素标签名重复的概率很高。那么在
    定位一组元素时,这种方式就派上了用场。上面的例子中先通过 find_elements_by_tag_name()找到一组标
    签名为 input 的元素。然后通过 for 循环进行遍历。在遍历的过程中通过 get_attribute()方法获取元素的 type
    属性,判断是否为“chcckbox”,如果为“chcckbox”那么这个元素就是一个复选框。对其进行 click()勾
    选操作。
    在本例中,因为通过浏览器打开的是一个本地的 html 文件,所以需要用到 Python 的 os 模块,
    path.abspath()方法用于获取当前路径下的文件。
    除此之外,我们也可以使用 XPath 或 CSS 来判断属性值,从而进行点击操作。

     1 #coding=utf-8
     2 from selenium import webdriver
     3 import os
     4 driver = webdriver.Firefox()
     5 file_path = 'file:///' + os.path.abspath('checkbox.html')
     6 driver.get(file_path)
     7 #通过 XPath 找到 type=checkbox 的元素
     8 #checkboxes = driver.find_elements_by_xpath("//input[@type='checkbox']")
     9 #通过 CSS 找到 type=checkbox 的元素
    10 checkboxes = driver.find_elements_by_css_selector('input[type=checkbox]')
    11 for checkbox in checkboxes:
    12 checkbox.click()
    13 # 打印当前页面上 type 为 checkbox 的个数
    14 print len(checkboxes)
    15 # 把页面上最后 1 个 checkbox 的勾给去掉
    16 driver.find_elements_by_css_selector('input[type=checkbox]').pop().click()
    17 driver.quit()
    checkbox

    通过 XPath 或 CSS 来查找一组元素,少去判断步骤,因为它本身已经做了判断,只需要循环对每一
    个元素进行 click()勾选即可。
    除此之外例子中还用到了 Python 所提供的两个有趣的方法。len()可获取元素的个数,通过 print 打印
    会得到一个 3 的结果。pop() 函数用于获取列表中的一个元素(默认为最后一个元素),并且返回该元素
    的值。因为前的循环已经所有复选框都勾选上了,再对这一组元素执行 pop().lick() 其实是对后一个元素取
    消勾选。如果只想勾选一组元素中的某一个呢。
    pop()或 pop(-1) 默认获取一组元素中的最后一个。
    pop(0) 默认获取一组元素中的第一个。
    pop(1) 默认获取一组元素中的第二个。
    ……
    这样就可以操作这一组元素中的元素了,只用数一数操作的元素是这一组中的第几个。

  • 相关阅读:
    java域名解析
    JDK8新特性面试
    java设计模式--单例模式
    EclipseEE导入项目出现的那些问题
    Eclipse配置Git发布项目到Github
    SVN本地服务器的搭建
    APK的反编译
    Oracle系列--级联删除和级联更新
    Oracle创建表空间和用户
    全方面了解和学习PHP框架 PHP培训教程
  • 原文地址:https://www.cnblogs.com/mtfan01/p/9064050.html
Copyright © 2011-2022 走看看