1. Selenium 框架介绍
- Selenium自动化测试框架是实现自动化测试的一个软件结构和功能组件集合。
- Selenium自动化测试框架是一个半成品,能够帮助用户实现自动化测试。
- Selenium是模仿浏览器行为的,当你运行测试类(爬虫)的时候,你就会发现selenium会打开一个浏览器,然后执行你的操作。
Selenium 的两种版本
- Selenium 1(Selenium RC,Remote Control):传统 Selenium 框架,支持多种编程语言脚本生成。但需要启动一个代理 Server 来处理用户与测试 Server 之间的通讯。
- Selenium 2(Selenium Webdriver):全新自动化接口,突破了 Selenium 1 的一些限制,剔除了中间 Server,适合熟悉 Selenium API 的 case 测试人员使用。
Selenium 引入了 Remote Control Server 这样一个代理 Server,JavaScript 脚本注入和与 Server 通讯都通过这个代理 Server 来进行。流程说明:
- 执行测试脚本,脚本向Selenium Server发起请求,要求和Selenium Server建立链接。
- Selenium Server的Launcher启动浏览器,向浏览器中插入Selenium Core的JavaScript代码库,并把浏览器的代理设置为Selenium Server的Http Proxy,确保后续Core的脚本域被访问的网站的脚本同源。
- 测试脚本向selenium Server发送Http请求,Selenium Server对请求进行解析,然后通过Http Proxy发送JS命令通知Selenium Core发送JS命令通知selenium Core执行操作浏览器的请求。
- Selenium Core收到指令后,执行测试脚本里指定的网页操作命令。
- 浏览器收到新的请求信息,于是发送Http请求给Selenium给Selenium Core里的Http Proxy,请求新的Web页面。(因为第二步中,selenium Server在启动浏览器的时候,已经把浏览器的代理地址设定为Selenium Server的Http Proxy)
- Selenium Server接收到请求后,自行重组http请求,向应用服务器发送请求并获取返回的web页面。
- Selenium Server的Http Proxy把接收的Web页面返回给浏览器。
简述:
- 客户端建立与 selenium-RC server 的连接。
- Selenium RC Server 启动一个浏览器(或是已经使用中),并注入 JS 代码
- 将 Selenese 代码传到客户端的 Selenium-Core 中。
- Selenium-Core 翻译并解析执行用户录制的操作。
- 让代理 Server 进行通讯
- Remote Control Server 负责跟远程 Web 应用服务器进行通讯。
- 操作完成,显示结果,并执行下一指令。
以上就是 Selenium Remote Control 的执行原理。
三个模块:
- 自动化测试代码:自动化测试代码发送请求给浏览器的驱动(比如火狐驱动、谷歌驱动)
- 浏览器驱动:它来解析这些自动化测试的代码,解析后把它们发送给浏览器
- 浏览器:执行浏览器驱动发来的指令,并最终完成工程师想要的操作。
Selenium脚本执行时后端六条实现的流程:
- 对于每一条Selenium脚本,一个http 请求会被创建并且发送给浏览器的驱动。
- 浏览器驱动中包含了一个HTTP Server,用来接收这些 http 请求
- HTTP Server接收到请求后根据请求来具体操控对应的浏览器
- 浏览器执行具体的测试步骤
- 浏览器将步骤执行结果返回给HTTP Server
- HTTP Server又将结果返回给Selenium的脚本,如果是错误的http代码我们就会在控制台看到对应的报错信息。
2. Selenium 框架使用
2.1 Selenium 安装与环境配置
- 安装selenium
pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/
- 安装chrome驱动程序要 selenium 与浏览器配合工作就必须安装浏览器对应的驱动程序。
chrome版本查看: chrome://version/
下载地址:https://npm.taobao.org/mirrors/chromedriver/
ChromeDriver 官方网站 https://sites.google.com/chromium.org/driver/downloads
下载chromedrive.exe的驱动程序,然后把它复制到python38\Scripts\目录下。
cmd命令打开命令行界面,输入“chromedriver”启动该驱动程序,查看是否配置成功。
2.2 常用指令
(1) 程序先从selenium引入webdriver,引入chrome程序的选择项目Options:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
(2) 设置启动chrome时不可见:
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
(3) 创建chome浏览器:
driver= webdriver.Chrome(chrome_options=chrome_options)
这样创建的chrome浏览器是不可见的,仅仅使用:
driver= webdriver.Chrome()
创建chrome浏览器,那么在程序执行时会弹出一个chrome浏览器。
(4) 使用driver.get(url)方法访问网页:
driver.get("http://127.0.0.1:5000")
(5) 通过driver.page_source 获取网页HTML代码(渲染后的数据页面): html=driver.page_source
print(html)
(6) driver.get_cookies() 获得页面的cookies
(7) 使 driver.current_url 查看请求的URL
(8) 用driver.close()关闭页面。driver.quit()关闭浏览器:
driver.close()
driver.quit()
(9)操作点击事件:
click()
(10)给输入框赋值:
send_keys()
编写Selenium爬虫程序
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome()
driver.get("http://127.0.0.1:5000")
html = driver.page_source
soup = BeautifulSoup(html, "lxml")
hMsg = soup.find("span", attrs={"id": "hMsg"}).text
print(hMsg)
jMsg = soup.find("span", attrs={"id": "jMsg"}).text
print(jMsg)
sMsg = soup.find("span", attrs={"id": "sMsg"}).text
print(sMsg)
运行结果:
Html Message
JavaScript Message
Server Message
采用Selenium的结构主要是模拟浏览器去访问网页,并充分执行网页中的 JavaScript程序,使得网页的数据充分下载,这样再用爬虫程序去爬取数据就能正确的爬取。