正文
回到顶部
2. selenium 原理
python不能直接操作浏览器,需要通过javascript进行操作浏览器,因为javascript中存在浏览器的解释器, 浏览器中没有python的运行环境。所以需要Python通过http请求向驱动发送指令,然后驱动调用 JS,然后浏览器才能做事情
2.1 操作元素基本方法
前言
前面已经把环境搭建好了,从这篇开始,正式学习selenium的webdriver框架。我们平常说的 selenium自动化,其实它并不是类似于QTP之类的有GUI界面的可视化工具,我们要学的是webdriver框架的API。
本篇主要讲如何用Python调用webdriver框架的API,对浏览器做一些常规的操作,如打开、前进、后退、刷新、设置窗口大小、截屏、退出等操作。
2.1.1 打开网页
1.从selenium里面导入webdriver模块
2.打开Firefox浏览器(Ie和Chrome对应下面的)
3.打开百度网址
2.1.2 设置休眠
1.由于打开百度网址后,页面加载需要几秒钟,所以最好等到页面加载完成后再继续下一步操作
2.导入time模块,time模块是Python自带的,所以无需下载
3.设置等待时间,单位是秒(s),时间值可以是小数也可以是整数
2.1.3 页面刷新
1.有时候页面操作后,数据可能没及时同步,需要重新刷新
2.这里可以模拟刷新页面操作,相当于浏览器输入框后面的刷新按钮
2.1.4 页面切换
1.当在一个浏览器打开两个页面后,想返回上一页面,相当于浏览器左上角的左箭头按钮。
2.返回到上一页面后,也可以切换到下一页,相当于浏览器左上角的右箭头按钮。
2.1.5 设置窗口大小
1.可以设置浏览器窗口大小,如设置窗口大小为手机分辨率540*960
2.也可以最大化窗口
2.1.76 退出
1.退出有两种方式,一种是close;另外一种是quit。
2.close用于关闭当前窗口,当打开的窗口较多时,就可以用close关闭部分窗口。
3.quit用于结束进程,关闭所有的窗口。
4.最后结束测试,要用quit。quit可以回收c盘的临时文件。
2.2 常用8种元素定位
2.2.1 查看页面元素
以百度搜索框为例,先打开百度网页
1.点右上角爬虫按钮
2.点左下角箭头
3.将箭头移动到百度搜索输入框上,输入框高亮状态
4.下方红色区域就是单位到输入框的属性:
2.2.2 find_element_by_id()
1.从上面定位到的元素属性中,可以看到有个id属性:id=“kw”,这里可以通过它的id属性定位到这个元素。
2.定位到搜索框后,用send_keys()方法,输入文本。
3. - id(重要): 表示的是一个元素的身份证号码,唯一 - 在同一个页面当中,某个 id 只能用一次 lanfuying - 如果元素有 id, 一般会优先使用 id 定位。 - 不好的消息:不是每个元素都有 id
2.2.3 find_element_by_name()
1.从上面定位到的元素属性中,可以看到有个name属性:name=“wd”,这里可以通过它的name属性单位到这个元素。
说明:这里运行后会报错,说明这个搜索框的name属性不是唯一的,无法通过name属性直接定位到输入框
2.用户输入input, 不出意外总会有 name 属性。
2.2.4 find_element_by_link_text()
1.定位百度页面上"hao123"这个按钮
2. 连接的文本,只能用来定位连接,可以定位链接里的文本
查看页面元素:
hao123
3.从元素属性可以分析出,有个href = "http://www.hao123.com
说明它是个超链接,对于这种元素,可以用以下方法:
2.2.5 find_element_by_partial_link_text()
1.有时候一个超链接它的字符串可能比较长,如果输入全称的话,会显示很长,这时候可以用一模糊匹配方式,截取其中一部分字符串就可以了
2.如“hao123”,只需输入“ao123”也可以定位到
2.2.6 find_element_by_class_name()
1.从上面定位到的元素属性中,可以看到有个class属性:class=“s_ipt”,这里可以通过它的class属性定位到这个元素。
2. 当 class 属性中间如果有空格, 元素定位会出现问题。使用class 定位时,元素中间不能有空格,有空格的话会默认为两个元素就无法定位了
2.2.7 find_element_by_tag_name()
1.从上面定位到的元素属性中,可以看到每个元素都有tag(标签)属性,如搜索框的标签属性,就是最前面的input。
2.很明显,在一个页面中,相同的标签有很多,所以一般不用标签来定位。以下例子,仅供参考和理解,运行肯定报错。
3. 最不重要的定位方式。标签名称,找出来的元素太多了 太小众,做测试用不到,做爬虫有用。做测试是越精确越好 爬虫是爬出来的越多要好
2.2.8 find_element_by_xpath()
1.以上定位方式都是通过元素的某个属性来定位的,如果一个元素它既没有id、name、class属性也不是超链接,这么办呢?或者说它的属性很多重复的。这个时候就可以用xpath解决。
2.xpath是一种路径语言,跟上面的定位原理不太一样,首先第一步要先学会用工具查看一个元素的xpath。
3.Xpath 表达式的方法: //要找的标签名称[ @属性名=”属性值”]
el =driver.find_element_by_xpath('//input[@id="kw"]')
//*[@id=“kw”]
//input[@id=‘kw’]
: 正则表达式:通配符,表示匹配所有的标签名
4. xpath 组合条件
4.1 xpath:标签
1.有时候同一个属性,同名的比较多,这时候可以通过标签筛选下,定位更准一点
2.如果不想制定标签名称,可以用号表示任意标签
3.如果想制定具体某个标签,就可以直接写标签名称
4.2 xpath:层级
1.如果一个元素,它的属性不是很明显,无法直接定位到,这时候我们可以先找它老爸(父元素)。
2.找到它老爸后,再找下个层级就能定位到了。
3.如上图所示,要定位的是input这个标签,它的老爸的id=s_kw_wrap。
4.要是它老爸的属性也不是很明显,就找它爷爷id=form。
5.于是就可以通过层级关系定位到。
4.3 xpath:索引
1.如果一个元素它的兄弟元素跟它的标签一样,这时候无法通过层级定位到。因为都是一个父亲生的,多胞胎兄弟。
2.虽然双胞胎兄弟很难识别,但是出生是有先后的,于是可以通过它在家里的排行老几定位到。
3.如下图三胞胎兄弟。
4.用xpath定位老大、老二和老三(这里索引是从1开始算起的,跟Python的索引不一样)。
5. xpath:逻辑运算
1.xpath还有一个比较强的功能,是可以多个属性逻辑运算的,可以支持与(and)、或(or)、非(not)
2.一般用的比较多的是and运算,同时满足两个属性
6. xpath:模糊匹配
1.xpath还有一个非常强大的功能,模糊匹配。
2.掌握了模糊匹配功能,基本上没有定位不到的。
3.比如我要定位百度页面的超链接“hao123”,在上一篇中讲过可以通过by_link,也可以通过by_partial_link,模糊匹配定位到。当然xpath也可以有同样的功能,并且更为强大。
2.2.9 CSS定位
前言
大部分人在使用selenium定位元素时,用的是xpath定位,因为xpath基本能解决定位的需求。css定位往往被忽略掉了,其实css定位也有它的价值,css定位更快,语法更简洁。
这一篇css的定位方法,主要是对比上一篇的xpath来的,基本上xpath能完成的,css也可以做到。两篇对比学习,更容易理解。
2.4.1 css:属性定位
1.css可以通过元素的id、class、标签这三个常规属性直接定位到
2.如下是百度输入框的的html代码:
3.css用#号表示id属性,如:#kw
4.css用.表示class属性,如:.s_ipt
5.css直接用标签名称,无任何标示符,如:input
2.3.0 问题
1. class_name有什么坑
有什么坑
当 class 属性中间如果有空格, 元素定位会出现问题。
当我使用自己的浏览器打开页面,有 id 属性,但是当我通过自动化程序打开的,id 属性消失了。
有些页面,会判断的浏览器的来源。
不能有空格,不能是复合 class
2. news_el 元素什么对象
WebElement 对象: 以下为webelement对象的常用的方法
- click
- send_keys
- clear
- el.find_element… 找在这个元素下面的子元素
- el.find_element vs driver.find_element
- el.text
- el.get_attribute 获取元素的属性
3. 如果元素无法找到是什么原因 ? 会引发什么问题 ?
确认元素表达方式是否正确
找元素的时候,页面上确实没有这个元素
确认有没有等待,代码运行的速度比网页加载的速度快 (设置等待时间)
确认你在没在指定窗口
确认你的元素 iframe
NoSuchElementException
4. find_element 和 find_elements区别
前者 查找元素得到一个 WebElement 对象 ,如果这个表达式匹配多个元素,使用 find_element 只会得到找到的第一个元素。
后者 查找在该页面符合条件的所有元素,把元素存放到列表当中。
可以理解为鱼钩和渔网的区别
5. 所有的属性–动态变化
所有的元素定位方式都需要注意的一个问题:动态变化。
动态变化:你这一次操作和下一次操作,用的是同样一个表达式,
2种情况,这个属性很有可能变
- 有数字, id=“new12” class
- 有一些不太规则的字符串,woefpwofewfcerpccoefeo