selenium简介

selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。

selenium可以用于爬虫,用于爬虫的目的是绕过大多数js加密和js渲染问题

selenium和requests的区别

requests是向服务器发送请求后,对返回的网页源代码进行解析,对于ajax加载需要更深的功力,大多数网站会通过JS来做反爬

selenium是模仿操作浏览器打开页面,并对F12内的网页代码进行解析------>比requests更粗暴,你网页上显示啥,就能获取啥数据

selenium库的安装

第一步:安装selenium模块包

    pip install selenium 或者setting里面安装,装不上就挂镜像

第二步:下载浏览器驱动 ------> 我是谷歌,所以下载的是Chromedriver

    地址:http://chromedriver.storage.googleapis.com/index.html

    注意使用的浏览器版本和驱动要对应,或者最接近的一个

    将下载的驱动解压后,放置在python目录下Scripts文件夹内(和pip一个路径),如果没有放置在这里,那么每次调用需要写明驱动所在绝对路径。

第三步:检查确认上述均为成功步骤

    新建项目键入如下代码

1 from selenium import webdriver
2 driver = webdriver.Chrome()

    如果能自动弹出一个浏览器窗口,并显示浏览器被自动化软件控制,即成功。

selenium的基本使用方法

导入模块,一般是导入webdriver模块,用于调用浏览器驱动,控制浏览器

 from selenium import webdriver 

打开浏览器,用变量driver保存该程序句柄,以方便调用

 driver = webdriver.Chrome() 

打开网页,比如打开百度

 driver.get(url='www.baidu.com') 

关闭页面

# 关闭浏览器
driver.quit()
# 关闭当前选项卡
driver.close()

selenium中的元素定位

selenium是解析F12的网页代码,是经过JS渲染的,那么从中寻找我们需要的目标,是我们必须掌握的内容,如何定位到元素?

复制代码
# 在其中通过id定位()内参数为目标标签的id值
driver.find_element_by_id()
# 在其中通过name定位,()内参数为目标标签的name值 driver.find_element_by_name()
# 在其中通过class name定位,()内参数为目标标签的class值 driver.find_element_by_class_name()
# 在其中通过tag_name定位,()内参数为目标标签的标签名 driver.find_element_by_tag_name()
# 在其中通过超链接文本定位,()内参数为目标链接的文本--->精确文本才能定位 driver.find_element_by_link_text()
# 在其中通过超链接文本定位,()内参数为目标链接的文本--->模糊文本即可定位 driver.find_element_by_partial_link_text()
# 在其中通过xpath定位,()内参数为目标标签的xpath路径 driver.find_element_by_xpath()
# 在其中通过css_selector定位,()内参数为目标标签的css_selectors值 driver.find_element_by_css_selector()
复制代码

上述方法中element单词是单数,所以他找到第一个目标后,就不找了,如果要找到多个,就把他改成复数elements,返回也会变成一个列表

一般情况下,我们都是通过标签定位,然后获取文本内容,同样,我们也可以反向操作,通过文本内容来定位标签

# 精确定位 下例中'文本内容'按照实际情况修改
driver.find_element_by_xpath("//*[text()='文本内容']")
# 模糊定位 下例中'文本内容'按照实际情况修改,文本可以只有一部分 driver.find_element_by_xpath("//*[contains(text(),'文本内容')]")

selenium元素定位后的使用

使用是肯定要用的,比如定位到输入框,怎么输入文字,定位到确定按钮,怎么按下去?

常见的就是输入和点击

输入

# 定位到input输入框
inp = driver.find_element_by_xpath('//input')

这时候,我们把input输入框位置的句柄保存为inp变量

inp.send_keys('输入的内容')

send_keys就是向某个标签发送数据,往input框发送数据,就是在输入框中填写内容

点击

# 定位到一个button按钮
btn = driver.find_element_by_xpath('//button')
btn.click()

注意,这里不一定非得定位到button按钮才能点击,只要你在解析网站的时候,你所选的目标标签可以被点击就行.

总结:首先要获取目标标签位置,然后在进行方法操作,元素定位是最重要的。

 

窗口切换

用selenium操作浏览器如果需要再打开新的界面,这个时候会有问题,因为我们用selenium操作的是第一个打开的窗口,所以新打开的页面我们是无法去操作的,所以我们要用到切换窗口,即handle切换方法:

js = 'window.open("https://www.baidu.com")'     #打开新标签
chrome.execute_script(js)                                  #执行语句

window_handles                                                #获取所有页面窗口的句柄

current_window_handle                                     #获取当前页面窗口的句柄

switch_to.window(window_name)                       #定位页面转到指定的window_name的页面

widow_handles的顺序并不是浏览器上标签的顺序,尽量避免多标签的操作

 

页面frame切换

在实际用selenium爬虫的过程中,明明定位的路径没有问题,却找不到元素,这时候可以考虑一下该页面是否存在frame的问题导致定位不到元素.

# 方法                                               作用
switch_to.frame(frame_local)             #切到指定frame,可用id活name(str)、index(int)、元素(WebElement)定位

switch_to.parent_frame()                   #切到父级frame,如果已经是主文档,则无效果,相当于后退回去

switch_to_default_content()               #切换到主页面,DOM树最开始的frame

 

页面弹窗

有时候会遇到弹窗的问题,主要有两种类型的弹窗(alert/prompt),一种是自定义弹窗,即一个自定义的div层,是隐藏页面中的,当触发了这个弹窗,它就显示出来,这种方式我们通过正常定位即可得到.

alert弹窗则通过下面方法处理:

复制代码
#方法                                                          作用
switch_to_alert                                      #定位到alert弹窗,返回一个弹窗对象

dismiss()                                              #对弹窗对象的取消操作

accept()                                               #对弹窗对象的确定操作
 
send_keys(key)                                    #在弹窗对象内的输入框输入数据

text                                                     #获取弹窗文本
复制代码

 

动作链

在selenium中除了点击动作外,还有一些稍微复杂的动作,就需要用到ActionChains这个子模块来满足我们的需求.

ActionChains可以完成复杂的页面交互行为,例如元素的拖拽,鼠标移动,悬停行为,内容菜单交互.

他的执行原理就是当调用ActionChains方法的时候不会立即执行,而是将所有的操作暂时存储在一个队列中,当调用perform()方法的时候,会按照队列中放入的先后顺序执行前面的操作.

导入的方法:

复制代码
from selenium.webdriver import ActionChains

# ActionChains提供的方法及作用
click(on_element=None) #鼠标左键单击传入的元素

double_click(on_element=None) #双击鼠标左键

context_click(on_element=None) #点击鼠标右键

click_and_hold(on_element=None) #点击鼠标左键,按住不放

release(on_element=None) #在某个元素位置松开鼠标左键

drag_and_drop(source,target) #拖拽到某个元素然后松开

drag_and_drop_by_offset(source,xoffset,yoffset) #拖拽到某个坐标,然后松开

move_to_element(to_element) #鼠标移动到某个元素

move_by_offset(xoffset,yoffset) #移动鼠标到指定的x,y位置

move_to_element_with_offset(to_element,xoffset,yoffset) #将鼠标移动到距某个元素多少距离的位置

perform() #执行链中的所有动作
复制代码

 

另外,我还总结了一些关于selenium的一些小技巧如下:

#方法                              说明
Chrome.refresh()            #刷新页面

Chrome.page_souce        #网页源代码

Chrome.cookies              #本业保存的cookie

Chrome.maximize_window()          #最大化窗口

 

以上就是对selenium目前的全部总结.