定位一个元素 webdriver提供了八种元素定位的方法,在python中,对应的方法就是:
定位方式:
1.id定位
path = 'http://www.bing.com'
driver = webdriver.Chrome()
driver.get(path)
driver.find_element_by_id('xxx')
2.name定位
driver.find_element_by_name('xxx')
3.class定位
driver.find_element_by_class_name('xxx')
4.tag定位
driver.find_element_by_tag_name('xxx')
5.link定位
driver.find_element_by_link_text('xxx')
6.partial link定位(用于有时文本链接太长)
driver.find_element_by_partial_link_text('xxx')
7.XPath定位
7.1绝对路径定位
driver.find_element_by_xpath('/html/body/header/div[2]/div/nav/ul/li[12]/a')
7.2利用元素属性定位
driver.find_element_by_xpath('//*[@id="subNavbar"]/ul/li[12]/a')
7.3层级和属性结合
7.4使用逻辑运算符
8.CSS定位
css是一种语言,用来描述HTML和XML文档的表现。css使用选择器来为页面元素绑定属性。这些选择器可以被selenium用作另外的定位策略。 css可以较为灵活地选择控件的任意属性,一般情况下定位速度比XPath快。
css选择器常见语法 1)通过class属性定位:
find_element_by_css_selector(".s_ipt")
find_element_by_css_selector(".bg s_btn")
find_element_by_css_selector()方法用于CSS语言定位元素,点号(.)表示通过class属性来定位元素。
2)通过id属性定位;
find_element_by_css_selector("#kw")
find_element_by_css_selector("#su")
3)井号(#)表示通过id属性来定位元素。通过标签名定位: find_element_by_css_selector(“input”)
在CSS语言中,用标签名定位元素不需要任何符号标识,直接使用标签名即可。但我们前面已经了解到,标签名重复的概率非常大,所以通过这种方式很难找到想要的元素。
1)通过父子关系定位:
find_element_by_css_selector("span>input")
上面的写法表示有父亲元素,它的标签名为span,查找它的所有标签名叫input 的子元素。
2)通过属性定位:
find_element_by_css_selector("[autocompletc=off]")
find_element_by_css_selector("[name=kw]")
find_element_by_css_selector('[type="submit"])
在CSS当中也可以使用元素的任意属性,只要这些属性可以唯一标识这个元素。对于属性值来说,可加引号,也可以不加,但注意和整个字符串的引号进行区分。
3)组合定位: 我们可以把上面的定位策略组合起来使用,这就大大加强了定位元素的唯一性。
find_element_by_css_selector("span.bg s_ipt_wr>input.s_ipt")
find_element_by_css_selector("span.bg s_btn_wr>input#su")
有一个父元素,它的标签名叫 span;它有一个class 属性值叫 bg s_ipt_wr:它有一个子元素,标签名叫input,并且这个子元素的class属性值叫s_ipt。我们要找的就是具有这么多特征的一个子元素。
9.用By定位元素(便于封装,通常是用这个)
find_element(By.ID, "kw"")
find_element(By.NAME, "wd")
find_element(By.CLASS_NAME,"s_ipt")
find_element(By.TAG_NAME,"input")
find_element(By.LINK_TEXT,"新闻")
find_element(By.PARTIAL_LINK_TEXT,"新")
find_element(By.XPATH,"//*[@class="bg s_btn']"")
10.定位一组 元素
定位一组元素的方法与定位单个元素的方法类似,唯一的区别是在单次element后面多加一个s表示复数。
定位一组元素适用场景: 1.批量操作元素,例如勾选页面上所有的复选框。 2.先获取一组元素,再从这组对象中过滤出需要操作的元素。
<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="c1">checkbox1</label><div class="controls "><input type="checkbox" id="c1"/></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>
例子: 勾选上述网页的复选框
通过tag_name的定位方法很难定位到单个元素,因为元素标签重名的概率很高。 所以在定位一组元素时,这种方式就可以用到了。
下面的例子先通过find_elements_by_tag_name()找到一组标签名为input的元素, 然后通过for循环进行遍历,在遍历的过程中,通过get_attribute()方法获取元素的type属性是否为“CheckBox”,如果是,就对其进行勾选操作
from selenium import webdriver
import os,time
#打开本地文件
driver=webdriver.Chrome()
url=r'C:\Users\86467\Desktop\checkbox.html'
driver.get(url)
#获取所有标签为input的标签
inputs=driver.find_elements_by_tag_name('input')
for i in inputs:
#匹配类型为复选框的标签
if i.get_attribute('type')=='checkbox':
#进行勾选
i.click()
time.sleep(2)
除此之外,还可以用XPath或CSS来直接判断属性值。 通过XPath或CSS来查找一组元素时,省去了判断步骤。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from selenium import webdriver
import os,time
#打开本地文件
driver=webdriver.Chrome()
url=r'C:\Users\86467\Desktop\checkbox.html'
driver.get(url)
#通过xpath找到type=checkbox的元素
inputs=driver.find_elements_by_xpath("//input[@type='checkbox']")
for i in inputs:
i.click()
time.sleep(2)
#
inpu=driver.find_elements_by_css_selector('input[type=checkbox]')
for i in inpu:
i.click()
time.sleep(2)
#计算元素的个数
print(len(inpu))
#pop()默认获取列表的最后一个元素,带参数则默认获取对应参数的元素
inpu.pop().click()
inputs.pop(0).click()
|