这里我将以Chrome
为例进行Selenium
功能的演示~
Selenium全攻略0.1. 安装selenium库0.2. 安装浏览器驱动1.1. 初始化浏览器对象1.2. 访问页面1.3. 设置浏览器大小1.4. 刷新页面1.5. 前进后退3.1. id定位3.2. name定位3.3. class定位3.4. tag定位3.5. link定位3.6. partial定位3.7. xpath定位3.8. css定位3.9. find_element的By定位3.10. 多个元素4.1. get_attribute获取属性4.2. 获取文本4.3. 获取其他属性5.1. 输入文本5.2. 点击5.3. 清除文本5.4. 回车确认5.5. 单选5.6. 多选5.7. 下拉框6.1. Frame切换6.2. 选项卡切换7.1. 左键7.2. 右键7.3. 双击7.4. 拖拽7.5. 悬停9.1. 强制等待9.2. 隐式等待9.3. 显式等待10.1. 运行Javascript,使用execute_script10.2. COOKIE10.3. 反屏蔽10.4.其他
0. 准备工作
在开始后续功能演示之前,我们需要先安装Chrome
浏览器并配置好ChromeDriver
,当然也需要安装selenium
库!
Chrome
浏览器哈
*手动安装*
先查看本地Chrome
浏览器版本:(两种方式均可)
在浏览器的地址栏键入Chrome://version
,即可查看浏览器版本号
或者点击Chrome
菜单 帮助→关于Google Chrome,查看浏览器版本号
再选择对应版本号的驱动版本
下载地址:https://chromedriver.storage.googleapis.com/index.html
最后进行环境变量配置,也就是将对应的ChromeDriver
的可执行文件chromedriver.exe
文件拖到Python
的Scripts
目录下。
注:当然也可以不这样做,但是在调用的时候指定chromedriver.exe
绝对路径亦可。
*自动安装*
自动安装需要用到第三方库webdriver_manager
,先安装这个库,然后调用对应的方法即可。
ChromeDriverManager().install()
方法就是自动安装驱动的操作,它会自动获取当前浏览器的版本并去下载对应的驱动到本地。
browser
对象,接下来我们就可以调用browser
来执行各种方法模拟浏览器的操作了。
进行页面访问使用的是get
方法,传入参数为待访问页面的URL
地址即可。
set_window_size()
方法可以用来设置浏览器大小(就是分辨率),而maximize_window
则是设置浏览器为全屏!
refresh()
方法可以用来进行浏览器页面刷新。
F5
快捷键。
前进后退也是我们在使用浏览器时非常常见的操作,这里forward()
方法可以用来实现前进,back()
可以用来实现后退。
selenium
打开某个页面,有一些基础属性如网页标题、网址、浏览器名称、页面源码等信息。
正则表达式
、Bs4
、xpath
以及pyquery
等工具进行解析提取想要的信息了。
3. 定位页面元素
我们在实际使用浏览器的时候,很重要的操作有输入文本、点击确定等等。对此,Selenium
提供了一系列的方法来方便我们实现以上操作。常说的8种
定位页面元素的操作方式,我们一一演示一下!
我们以百度首页的搜索框节点为例,搜索python
搜索框
搜索框的html
结构:
HTML
是通过tag
来定义功能的,比如input
是输入,table
是表格等等。每个元素其实就是一个tag
,一个tag
往往用来定义一类功能,我们查看百度首页的html
代码,可以看到有很多同类tag
,所以其实很难通过tag
去区分不同的元素。
input
,以上代码会报错。
这种方法顾名思义就是用来定位文本链接的,比如百度首页上方的分类模块链接。
id
或name
或class
或超链接文本
的属性,那么我们就可以通过这个唯一的属性值来定位他们。
但是在实际工作中并非有这么美好,那么这个时候我们就只能通过xpath
或者css
来定位了。
xpath
要简洁些,定位速度也要快些。
8
种定位方法,Selenium
还提供了一个通用的方法find_element()
,这个方法有两个参数:定位方式和定位值。
find_elements
,得到的结果会是列表形式。简单来说,就是element
后面多了复数标识s
,其他操作一致。
4. 获取页面元素属性
既然我们有很多方式来定位页面的元素,那么接下来就可以考虑获取以下元素的属性了,尤其是用Selenium
进行网络爬虫的时候。
以百度首页的logo为例,获取logo相关属性
text
属性,直接调用即可
python
,然后回车就出查询操作结果的情况。
Select
模块。
先导入该类
select
模块中有以下定位方法
Selenium
打开一个页面之后,默认是在父页面进行操作,此时如果这个页面还有子页面,想要获取子页面的节点元素信息则需要切换到子页面进行擦走,这时候switch_to.frame()
就来了。如果想回到父页面,用switch_to.parent_frame()
即可。6.2. 选项卡切换
我们在访问网页的时候会打开很多个页面,在
Selenium
中提供了一些方法方便我们对这些页面进行操作。
current_window_handle
:获取当前窗口的句柄。
window_handles
:返回当前浏览器的所有窗口的句柄。
switch_to_window()
:用于切换到对应的窗口。
ActionChains
类。
click()
操作。7.2. 右键
ActionChains(browser)
:调用ActionChains()
类,并将浏览器驱动browser
作为参数传入
context_click(right_click)
:模拟鼠标双击,需要传入指定元素定位作为参数
perform()
:执行ActionChains()
中储存的所有操作,可以看做是执行之前一系列的操作
drag_and_drop(source,target)
拖拽操作嘛,开始位置和结束位置需要被指定,这个常用于滑块类验证码的操作之类。
我们以菜鸟教程的一个案例来进行演示
https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable
selenium
中的Keys()
类提供了大部分的键盘操作方法,通过send_keys()
方法来模拟键盘上的按键。
引入Keys
类
send_keys(Keys.BACK_SPACE)
:删除键(BackSpace)
send_keys(Keys.SPACE)
:空格键(Space)
send_keys(Keys.TAB)
:制表键(TAB)
send_keys(Keys.ESCAPE)
:回退键(ESCAPE)
send_keys(Keys.ENTER)
:回车键(ENTER)
send_keys(Keys.CONTRL,'a')
:全选(Ctrl+A)
send_keys(Keys.CONTRL,'c')
:复制(Ctrl+C)
send_keys(Keys.CONTRL,'x')
:剪切(Ctrl+X)
send_keys(Keys.CONTRL,'v')
:粘贴(Ctrl+V)
send_keys(Keys.F1)
:键盘F1
.....
send_keys(Keys.F12)
:键盘F12
实例操作演示:
定位需要操作的元素,然后操作即可!
ajax
加载的网页,页面元素可能不是同时加载出来的,这个时候尝试在get
方法执行完成时获取网页源代码可能并非浏览器完全加载完成的页面。所以,这种情况下需要设置延时等待一定时间,确保全部节点都加载出来。
三种方式可以来玩玩:强制等待、隐式等待和显式等待
就很简单了,直接time.sleep(n)
强制等待n秒,在执行get
方法之后执行。
implicitly_wait()
设置等待时间,如果到时间有元素节点没有加载出来,就会抛出异常。
driver
: 浏览器驱动
timeout
: 超时时间,等待的最长时间(同时要考虑隐性等待时间)
poll_frequency
: 每次检测的间隔时间,默认是0.5秒
ignored_exceptions
:超时后的异常信息,默认情况下抛出NoSuchElementException
异常
until(method,message='')
method
: 在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False
message
: 如果超时,抛出TimeoutException
,将message
传入异常
until_not(method,message='')
until_not
与until
相反,until
是当某元素出现或什么条件成立则继续执行,until_not
是当某元素消失或什么条件不成立则继续执行,参数也相同。
其他等待条件
Javascript
,使用execute_script
方法来实现。
selenium
使用过程中,还可以很方便对COOKIE
进行获取、添加与删除等操作。
Selenium
给屏蔽了,不知道怎么搞!!
使用mitmproxy
import re
from mitmproxy import ctx
def response(flow):
"""修改应答数据"""
if '/js/yoda.' in flow.request.url:
# 屏蔽selenium检测
for webdriver_key in [ 'webdriver', '__driver_evaluate', '__webdriver_evaluate', '__selenium_evaluate', '__fxdriver_evaluate', '__driver_unwrapped', '__webdriver_unwrapped', '__selenium_unwrapped', '__fxdriver_unwrapped', '_Selenium_IDE_Recorder', '_selenium', 'calledSelenium', '_WEBDRIVER_ELEM_CACHE', 'ChromeDriverw', 'driver-evaluate', 'webdriver-evaluate', 'selenium-evaluate', 'webdriverCommand', 'webdriver-evaluate-response', '__webdriverFunc', '__webdriver_script_fn', '__$webdriverAsyncExecutor', '__lastWatirAlert', '__lastWatirConfirm', '__lastWatirPrompt', '$chrome_asyncScriptInfo', '$cdc_asdjflasutopfhvcZLmcfl_']:
ctx.log.info( 'Remove "{}" from {}.'.format(webdriver_key, flow.request.url))
flow.response.text = flow.response.text.replace( '"{}"'.format(webdriver_key), '"NO-SUCH-ATTR"')
flow.response.text = flow.response.text.replace( 't.webdriver', 'false')
flow.response.text = flow.response.text.replace( 'ChromeDriver', '')
除了上述操作外,还有许多其他操作,遇到了就现场搜吧!如切换到弹出框等。