一、定位一组元素
WebDriver还提供了与前面所对应的8钟用于定位一组元素的方法。
定位一组元素的方法与定位单个元素的方法类似,唯一的区别是在单词element后面多了一个S表示复数。定位一组元素一般用于以下场景:
(1)批量操作元素,例如勾选页面上所有的复选框。
(2)先获取一组元素,再从这组对象中过滤出需要操作的元素。例如定位出页面上所有的CheckBox,然后选择其中的一个进行操作。
#checkbox.html <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <title>Checkbox</title> <link href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet"/> <script src="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.js" ></script> </head> <body> <h3>checkbox</h3> <div class="well" > <form class="form-horizontal"> <div class="control-group"> <label class="control-label" for="cl" >checkbox1</label> <div class="controls"> <input type="checkbox" id="cl" /> </div> </div> <div class="control-group"> <label class="control-label" for="c2">checkbox2</label> <div class="controls"> <input type="checkbox" id="c2" /> </div> </div> <div class="control-group"> <label class="control-label" for="c3">checkbox3</label> <div class="controls"> <input type="checkbox" id="c3" /> </div> </div> </form> </div> </body> </html>
这是手动创建的一个html页面,用浏览器打开如下图所示
通过一个实例来操作页面上的这一组复选框
#checkbox.py #coding:utf-8 from selenium import webdriver import os,time driver=webdriver.Chrome() file_path='file:///'+os.path.abspath('checkbox.html') driver.get(file_path) #选择页面上所有的tag name为input的元素 inputs=driver.find_elements_by_tag_name('input') #然后从中过滤出type为checkbox的元素,单击勾选 for i in inputs: if i.get_attribute('type') == 'checkbox': i.click() time.sleep(1) driver.quit()
在上面的这个例子中先通过find_elements_by_tag_name()找到一组标签名为input的元素,然后通过for循环进行遍历,在遍历过程中,通过get_attribute()方法获取元素的type属性是否为“checkbox”,如果为“checkbox”,就认为这个元素是一个复选框,对其进行勾选操作。
这里用到了Python的OS模块,path.abspath()方法用于获取当前路径下的文件。
#checkbox.py #coding:utf-8 from selenium import webdriver import os,time driver=webdriver.Chrome() 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() time.sleep(1) #打印当前页面上type为checkbox的个数 print(len(checkboxes)) #把页面上最后1个checkbox的勾给去掉 driver.find_elements_by_css_selector('input[type=checkbox]').pop().click() driver.quit()
通过xpath或css来查找一组元素是,省去了判断步骤,因为定位方法已经做了判断,只需循环对这一组元素进行勾选即可。
上例中,用到了两个方法,
(1)len()方法可以用来计算元素的个数,通过print()打印出计算的结果。
(2)pop()方法用于获取列表中的一个元素(默认为最后一个元素),并且返回该元素的值。因为前面的循环已经将所有复选框都勾选上了,再对这一组元素执行pop().click(),其实是对最后一个元素取消勾选。
pop()或pop(-1): 默认获取一组元素中的最后一个
pop(0):获取一组元素中的第一个
pop(1):获取一组元素中的第二个
……..
这样就可以操作一组元素中的任意一个元素了,只需数一数需操作的元素是这一组中的第几个。