上一次爬取网易云的个人专辑图片,这次来介绍WebDriver定位元素的方法。
在社会上,我们要找一个人,首先要确定他身上的属性,比如:身份证,电话号码,性别,居住城市,家乡之类的。而网页也类似如何,由很多种元素来构成,然后交给浏览器进行解析,最后展示的是一个简洁的页面。
WebDriver提供多种元素定位方法,下面用Python语言来介绍这些元素定位:
1、id定位
id属性在HTML文档中必须是唯一的。WebDriver提供id的定位方法就是通过id属性来寻找
通过find_element_by_id(id的名称) 如:
find_element_by_id("kw") 百度输入框
find_element_by_id("su") 百度搜索
2、name定位
HTML规定name来指定元素的名称,通过name来定位百度输入框
find_element_by_name(填写name属性的值)
如百度输入框:find_element_by_name("wd")
3、class定位
HTML规定clss来指定元素的类名。其用法与id、name类似,如通过class属性定位百度输入框和搜索按钮:
find_element_by_class_name("s_ipt")
find_element_by_class_name("s_btn")
即find_element_by_class_name()方法通过class属性来定位元素。
4、tag定位
HTML的本质就是通过tag来定义实现不同的功能,HTML是由tag来构成的,所以往往运用tag来定位的话,都是定位一类功能,比如下拉框,单选框或者常用的输入框。如通过tag name定位百度的输入框
find_element_by_tag_name("input")
即find_element_by_tag_name()方法通过元素的tag name来定位元素。
5、link定位(一般用于a标签里面的文本元素)
find_element_by_link_text("新闻")
find_element_by_link_text("hao123")
find_element_by_link_text("地图")
find_element_by_link_text("视频")
find_element_by_link_text("贴吧")
find_element_by_link_text()方法通过元素标签对之间的文本信息来定位元素。
7、Xpath定位
Xpath是一种在XML文档中定位元素的语言。因为HTML可以看作XML的一种实现,所以可以使用这种强大的语言在web应用中定位元素。相当于绝对路径,一般都是唯一的。
find_element_by_xpath("html/body/div/div/div/div/div/form/span/input") 百度输入框
find_element_by_xpath("html/body/div/div/div/div/div/form/span[2]/input")百度搜索
Xpath主要用标签名的层级关系来定位元素的绝对路径,最外层为html语言。在body文本内,一级一级往下查找,如果一个层级下有多个相同的标签名,那个就按上下顺序确定是第几个
图上的方法,比较容易寻找到元素的Xpath
利用元素属性定位
除了使用绝对路径外,Xpath也可以使用元素的属性来定位。同样以百度输入框和搜索按钮为例:
find_element_by_xpath("//input[@id='kw']")
find_element_by_xpath("//input[@id='su']")
//表示当前页面某个目录下,input表示定位元素的标签名,[@id='kw']表示这个元素的id属性值等于kw。下面通过name和class属性值来定位:
find_element_by_xpath("//input[@name='wd']")
find_element_by_xpath("//input[@class='s_ipt']")
find_element_by_xpath("//*[@class='s_btn']")
如果不想指定标签名,可以用星号(*)代替。当然,使用Xpath不局限于id、name、class三个属性值,元素的任意属性值都可以使用,只要它能唯一的标识一个元素。
find_element_by_xpath("//input[@maxlength='100']")
find_element_by_xpath("//input[@value='']")
find_element_by_xpath("//input[@type='snbmit']")
层级与属性结合
如果一个元素本身没有可以唯一标识这个元素的属性值,那么可以找其上一级元素,如果它的上一级元素有可以唯一标识属性的值,也可使用。
假如百度输入框本身没有可以利用的属性值,那么可以查找它的上一级属性,如下:
find_element_by_xpath("//span[@class='s_ipt_wr']/input")
span[@class='bg s_ipt_wr']通过class属性定位父元素,后面/input就表示父元素下面的子元素。如果父元素没有可利用的属性值,那么可以继续向上查找“爷爷”元素。
find_element_by_xpath("//form[@id='form']/span/input")
find_element_by_xpath("//form[@id='form']/span[2]/input") #百度搜索按钮
可以通过这种方法一级一级地向上查找,直到最外层的<html>标签,也是一个绝对路径的写法了。
使用逻辑运算符
如果一个属性不能唯一地区分一个元素,我们还可以使用逻辑运算符连接多个属性来查找元素。如同时使用id和class来唯一标识百度输入框,通过逻辑运算符“and”来连接两个条件。如下:
find_element_by_xpath("//input[@id='kw' and @class='s_ipt']/span/input")
当然可以用“and”连接更多的属性来唯一地标识一个元素。