那 8 种定位方法是真对单元素定位的,WebDriver 还提供了与之对应的 8 种定位方法用于定位一组元素。

lua 多选框被选择 多选框如何定位_html

定位一组对象的方法与定位单个对象的方法类似,唯一的区别是在单词 element 后面多了一个 s 表示复数。定位一组对象一般用于以下场景:

  • 批量操作对象,比如将页面上所有的复选框都被勾选。
  • 先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。比如定位出页面上所有的checkbox,然后选择最后一个。

本地有一个html文件,写了三个标签,显示出现效果如图:

lua 多选框被选择 多选框如何定位_复选框_02

我们现在要全选这三个框

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

前面在提到通过 tag name 的定位方式很难定位到单个元素,因为元素标签名重复的概率很高。那么在定位一组元素时,这种方式就派上了用场。上面的例子中先通过 find_elements_by_tag_name()找到一组标签名为 input 的元素。然后通过 for 循环进行遍历。在遍历的过程中通过 get_attribute()方法获取元素的 type
属性,判断是否为“checkbox”,如果为“checkbox”那么这个元素就是一个复选框。对其进行 click()勾选操作。

在本例中,因为通过浏览器打开的是一个本地的 html 文件,所以需要用到 Python 的 os模块,path.abspath()方法用于获取当前路径下的文件。除此之外,我们也可以使用 XPath 或 CSS 来判断属性值,从而进行点击操作

#coding=utf-8
from selenium import webdriver
import os
driver = webdriver.Firefox()
file_path = 'file:///' + os.path.abspath('checkbox.html')
driver.get(file_path)

#通过 XPath 找到 type=checkbox 的元素
#checkboxes = driver.find_elements_by_xpath("//input[@type='checkbox']")
#通过 CSS 找到 type=checkbox 的元素
checkboxes = driver.find_elements_by_css_selector('input[type=checkbox]')
for checkbox in checkboxes:
  checkbox.click()
# 打印当前页面上 type 为 checkbox 的个数
print len(checkboxes)

# 把页面上最后 1 个 checkbox 的勾给去掉
driver.find_elements_by_css_selector('input[type=checkbox]').pop().click()
driver.quit()

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