根据ID定位 by_id
当所定位的元素具有id属性的时候我们可以通过by_id来定位该元素。
例如打开百度首页,定位搜索框后输入Selenium。搜索框页面源代码:属性id值为kw
from selenium import webdriver#导包
driver = webdriver.Chrome()#实例化对象
driver.get('http://www.baidu.com')#通过对象里的get方法打开百度网址
driver.find_element_by_id('kw')#通过ID定位到搜索框
根据name定位 by_name
当所定位的元素具有name属性的时候我们可以通过by_name来定位该元素。
例如打开百度首页,定位搜索框后输入Selenium。搜索框页面源代码:属性name值为wd
from selenium import webdriver#导包
driver = webdriver.Chrome()#实例化对象
driver.get('http://www.baidu.com')#通过对象里的get方法打开百度网址
driver.find_element_by_name('wd')#通过name定位到搜索框
根据class定位 by_class_name
当所定位的元素具有class属性的时候我们可以通过by_class_name来定位该元素。
例如打开百度首页,定位搜索框后输入Selenium。搜索框页面源代码:属性calssname值为s_ipt
from selenium import webdriver#导包
driver = webdriver.Chrome()#实例化对象
driver.get('http://www.baidu.com')#通过对象里的get方法打开百度网址
driver.find_element_by_class_name('s_ipt')#通过class定位到搜索框
根据标签名定位 by_tag_name
by_tag_name方法可以通过元素的标签名来查找元素。由于搜索到的标签名通常不止一个,所以一般结合使用find_elements方法来使用。
例如打开百度首页,获取超链接地图的文本信息。从图中可以看到标签名为a的很多,无法精确定位,需要结合name属性才能过滤出我们要的元素。超链接地图源代码:标签名为a,属性name值为tj_trmap。需求: 使用tag_name属性定位百度首页地图链接
from selenium import webdriver#导包
driver = webdriver.Chrome()#实例化对象
driver.get('http://www.baidu.com')#通过对象里的get方法打开百度网址
data = driver.find_elements_by_tag_name('a')
print(data)
for i in data:
print(i.get_attribute('outerHTML'))
根据超链接文字定位 ,只能定位链接文本 by_link_text
by_link_text通过超文本链接上的文字信息来定位元素,这种方式一般专门用于定位页面上的超文本链接。
例如打开百度首页,定位点击超链接新闻。
超链接地图源代码:链接文本值为”新闻”
from selenium import webdriver#导包
driver = webdriver.Chrome()#实例化对象
driver.get('http://www.baidu.com')#通过对象里的get方法打开百度网址
driver.find_element_by_link_text('新闻')#根据超链接定位百度首页新闻
根据超链接部分文本定位 by_partial_link_text
当你不能准确知道超链接上的文本信息或者只想通过一些关键字进行匹配时,可以使用by_partial_link_text这个方法来通过部分链接文字进行匹配。
例如打开百度首页,定位点击超链接新闻。
超链接新闻源代码:链接文本值为”新闻”,在代码里用”新”进行匹配
脚本代码:使用partial_link_text定位百度首页新闻链接
from selenium import webdriver#导包
driver = webdriver.Chrome()#实例化对象
driver.get('http://www.baidu.com')#通过对象里的get方法打开百度网址
driver.find_element_by_partial_link_text("新")#根据超链接部分文本定位百度首页新闻
Selenium的Xpath定位
语法 xpath的语法: /:表示从根目录开始 (一般不会使用) //:表示从相对路径开始 @:表示选取属性
1.标签+属性进行xpath定位
//标签名[@属性名=属性值] 例如:定位百度首页的输入框标签 //input[@autocomplete="off"]
from selenium import webdriver#导包
driver = webdriver.Chrome()#实例化对象
driver.get('http://www.baidu.com')#通过对象里的get方法打开百度网址
driver.find_element_by_xpath('//input[@autocomplete="off"]')#根据超链接部分文本定位百度首页新闻
2.层级定位
//标签名[@属性名=属性值]/子标签名 只找标签名下面的子标签,不包含更下一层的标签 //标签名[@属性名=属性值]//子标签名 找到该标签名下面所有符合规则的子标签名
from selenium import webdriver#导包
driver = webdriver.Chrome()#实例化对象
driver.get('http://www.baidu.com')#通过对象里的get方法打开百度网址
ele = driver.find_element_by_xpath('//form[@action="/s"]/input')# 层级定位
3.索引定位 索引从 1 开始 只查找平级标签
//标签名/子标签名[索引值] 例如:定位百度的input标签 //form[@action="/s"]/input[2]
from selenium import webdriver#导包
driver = webdriver.Chrome()#实例化对象
driver.get('http://www.baidu.com')#通过对象里的get方法打开百度网址
ele = driver.find_element_by_xpath('//form[@action="/s"]/input[2]')#索引定位
4.模糊匹配
//标签名[contains(@属性名,部分属性值)] 例如:定位百度首页的logo标签 //a[contains(@id,"result_")]
from selenium import webdriver#导包
driver = webdriver.Chrome()#实例化对象
driver.get('http://www.baidu.com')#通过对象里的get方法打开百度网址
ele = driver.find_element_by_xpath('//a[contains(@id,"result_")]')#模糊匹配
5.多条件查找
//标签名[@属性1=属性值1 and @属性2=属性值2]
例如:定位百度的input标签
//input[@type="hidden" and @name="rn"]
from selenium import webdriver#导包
driver = webdriver.Chrome()#实例化对象
driver.get('http://www.baidu.com')#通过对象里的get方法打开百度网址
ele = driver.find_element_by_xpath('//input[@type="hidden" and @name="rn"]')#多条件查找
css元素定位
CSS(Cascading Style Sheets)是一种语言,它被用来描述HTML 和XML 文档的表现。CSS 使用选择器来为页面元素绑定css属性。这些选择器可以被selenium 用作另外的定位策略。
by_css_selector通过CSS选择器查找元素,这种元素定位方式跟by_xpath比较类似,Selenium官网的Document里极力推荐使用CSS locator,而不是XPath来定位元素,原因是CSS locator比XPath locator速度快,特别是在IE下比XPath更高效更准确更易编写,对各种浏览器支持也很好。
1.标签+属性定位
标签名[属性名=属性值] 例如:input[id="kw"] 类选择器: .class名 id选择器: #id值
from selenium import webdriver#导包
driver = webdriver.Chrome()#实例化对象
driver.get('http://www.baidu.com')#通过对象里的get方法打开百度网址
ele = driver.find_element_by_css_selector('input[id="kw"]') # 标签+属性
ele = driver.find_element_by_css_selector('#kw')# id选择器
ele = driver.find_element_by_css_selector('.s_ipt')#class选择器
2.层级
标签名[属性名=属性值] 子标签 包含选择器会选择子标签以及子标签下面的标签 标签名[属性名=属性值]>子标签 只会选择该标签下的子标签 例如:form[id='form'] input
from selenium import webdriver#导包
driver = webdriver.Chrome()#实例化对象
driver.get('http://www.baidu.com')#通过对象里的get方法打开百度网址
ele = driver.find_element_by_css_selector("form[id='form'] input")#层级
3.索引
标签名[属性名=属性值] :nth-child(索引值) 只要标签名下面是第索引个标签的都会找到 标签名[属性名=属性值]>:nth-child(索引值) 只找标签名下面的第索引个标签 例如:form[id='form']>:nth-child(1)
from selenium import webdriver#导包
driver = webdriver.Chrome()#实例化对象
driver.get('http://www.baidu.com')#通过对象里的get方法打开百度网址
ele = driver.find_element_by_css_selector('form[id='form']>:nth-child(1)')#索引定位
4.模糊匹配
标签名[属性名*=部分属性值] 例如:input[autocomplete*="of"]
from selenium import webdriver#导包
driver = webdriver.Chrome()#实例化对象
driver.get('http://www.baidu.com')#通过对象里的get方法打开百度网址
ele = driver.find_element_by_css_selector('input[autocomplete*="of"]')# 模糊匹配
5.多条件查找
标签名[属性名1=属性值1][属性名2=属性值2] 例如:input[type="hidden"][name="f"]
from selenium import webdriver#导包
driver = webdriver.Chrome()#实例化对象
driver.get('http://www.baidu.com')#通过对象里的get方法打开百度网址
ele = driver.find_element_by_css_selector('input[type="hidden"][name="f"]')# 多条件匹配