如果想批量的定位一组元素,如何实现呢?Python语言里提供了这样的方法,如下:
一共提供了8个定位一组元素的方法,其实,这几个方法和定位单个元素的方法是有关联的。在命名上一个是单数形式,一个是复数形式,前者定位一个元素,后者定位多个元素。
Tag定位一组元素
以一个复选框为例,可以多选,通过WebDriver提供的多元素定位方法定位复选框的每个选项。复选框:
右键单击查看网页源码:
如上,3个input标签,类型都是checkbox的复选框,name属性都是fruit,只有value属性值不同。在一组元素定位中,有一个tag定位(find_elements_by_tag_name),上面3个复选框就可以通过它们相同的tag来进行定位。示例代码:
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
# 打开checkoutbox.html本地文件,路径D:/checkbox.html
driver.get("file://D:/checkbox.html")
inputs = driver.find_elements_by_tag_name("input")
# 遍历每个input
for cb in inputs:
if cb.get_attribute("type") == "checkbox":
cb.click()
# 暂停1s,便于查看点击选中的效果
sleep(1)
driver.quit()
这段代码打开了一个本地文件,名称为checkbox.html,“file://”其实就是本地文件的意思,如果是http://,那么对应的就是网络资源了。运行脚本,每隔1s就会有一个复选框被选中,最终效果如下:
XPath定位一组元素
input复选框有共同的属性,那就是name,都是fruit。而name属性就可以写成XPath的格式,那么,我们用find_elements_by_xpath来试试!
find_elements_by_xpath函数定义:
# 通过xpath定位一组元素
# xpath,目标元素组的xpath,这一组的元素有共同的xpath
find_elements_by_xpath(self, xpath)
通过WebDriver Element Locator可以找到这一组元素的XPath
//input[@name='fruit']
将Tag定位一组元素的示例通过xpath完成,实例代码:
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
# 打开checkoutbox.html本地文件,路径D:/checkbox.html
driver.get("file://D:/checkbox.html")
inputs = driver.find_elements_by_xpath("//input[@name='fruit']")
# 遍历每个input
for cb in inputs:
if cb.get_attribute("type") == "checkbox":
cb.click()
# 暂停1s,便于查看点击选中的效果
sleep(1)
driver.quit()
运行以上代码,可以看到与Tag定位具有相同的效果!
最后
定位一组元素,就是找到这一组元素的共同特性,比如name,tag,xpath等,然后通过find_elements_by_xxx方法获取目标元素集,最后遍历操作元素。同学们运用的时候需要注意find_elements为复数形式,如果不小心输入了单数形式,就只会返回第一个元素,而且排查过程也容易浪费时间。