Selenium 是一套跨平台的浏览器自动化测试框架(工具),支持在多种系统环境、多种浏览器环境下使用,还可以使用多种编程语言来编写测试。
Selenium
有多个项目构成,形成了一个多功能的测试系统:
**注意:**如出现Selenium官网访问缓慢,可以在 C:\Windows\System32\drivers\etc\hosts
文件内添加如下内容后尝试
172.217.31.243 www.seleniumhq.org
Selenium 1.0(又名,Selenium RC 或 Selenium Remote Control) 发布于2004年,基本构成如下:
主要的两个组件为:
Selenese
命令(Selenese 是 Selenium命令集合),并充当HTTP代理,拦截和验证在浏览器和AUT之间传递的HTTP消息。简化的架构图如下:
Selenium 2 = WebDriver + Selenium 1
Selenium 2.0发布于2011年,是Selenium 1.0与Selenium WebDriver合并而成的一款性能更佳的产品。
WebDriver是一种用于自动化Web应用程序测试的工具,尤其是用于验证它们是否按预期工作。它旨在提供一个易于探索和理解的友好API,比Selenium-RC(1.0)API更易于使用,这将有助于使您的测试更易于阅读和维护。它不依赖于任何特定的测试框架,因此它可以在单元测试项目中使用。
关于 Webdriver更多内容,可以查看w3c文档 2013版 2018版
Selenium 2.0 具有来自 WebDriver 的清晰面向对象 API,并能以最佳的方式与浏览器进行交互,更多Selenium WebDriver的API接口操作可以查看此处。该版本中主推WebDriver,可以将其看做 Selenium RC 的替代。因为要保持向下兼容,Selenium 2.0 中并没有彻底放弃 Selenium RC。
Selenium 3.0首次发布于 2016年5月,主要有如下更新:
三个版本关系大致如下:
为了实现Selenium对浏览器的操作,针对几款主流的浏览器,提供了对应的 driver
浏览器driver | 地址 |
---|---|
Chrome - ChromeDriver | github 下载地址1 下载地址2 |
Firefox - GeckoDriver | github 下载地址 |
Edge - Microsoft WebDriver | github 下载地址 |
Safari - WebDriver | source |
其他浏览器Driver |
此处下载 |
对于 Selenium 的这里仅作简略介绍,大家可以参看官方文档或类似书籍来学习。下面通过一些小示例,简单记录在 Windows 10
、Python 2.7.15
、Selenium 3.14.1
、Chrome 71.0.3578.80
环境下,Selenium webdriver API 驱动 Chrome 浏览器操作的过程。
要 Selenium
可以操作对应版本的浏览器,就要下载对应的 Driver
,下面为 ChromeDriver
对应的 Chrome
版本
chromedriver版本 | 支持的Chrome版本 |
---|---|
v2.44 | v69-71 |
v2.43 | v69-71 |
v2.42 | v68-70 |
v2.41 | v67-69 |
v2.40 | v66-68 |
v2.39 | v66-68 |
v2.38 | v65-67 |
v2.37 | v64-66 |
v2.36 | v63-65 |
v2.35 | v62-64 |
v2.34 | v61-63 |
v2.33 | v60-62 |
v2.32 | v59-61 |
v2.31 | v58-60 |
v2.30 | v58-60 |
v2.29 | v56-58 |
v2.28 | v55-57 |
v2.27 | v54-56 |
v2.26 | v53-55 |
v2.25 | v53-55 |
**注意:**Chrome 70+ 版本后出现对应小版本的chromedriver,如本文浏览器版本为
71.0.3578.80
,则下载对应该版本的chromedriver。更多版本查看此处。
Selenium Python bindings 是Selenium WebDriver的Python绑定版本,用于Python的自动化浏览器交互操作。
支持 Python 2.7
及 Python 3.4+
版本。
Python安装Selenium可以通过如下命令
pip install selenium
或
easy_install selenium
如果使用 Anaconda
或 Miniconda
,则使用如下命令安装
conda install seleium
下载对应当前 Chrome
浏览器版本的 chromedriver
,在任意目录解压后,将解压后的路径配置到环境变量中方便程序中直接引用。
**注意:**64位浏览器下载32位driver即可。
注意: 操作不同浏览器,需要下载对应浏览器版本的driver,并添加driver路径到环境变量中,否则运行代码时,会出现类似
selenium.common.exceptions.WebDriverException: Message: 'xxxdriver' executable needs to be in PATH.
的异常提示
以下演示 Selenium
操控 Chrome
浏览器,打开百度页面
from selenium import webdriver
chromedriver = "D:\ProgramData\pkgs\chromedriver"
driver = webdriver.Chrome(chromedriver)
# driver = webdriver.Chrome() # 设置了chromedriver的环境变量,则此行代码等效于上面两行代码
driver.get("https://www.baidu.com")
driver.maximize_window() # 好像没有效果。。。
driver.quit()
get
方法会在页面 onload
完成后显示页面,并继续执行后续代码,如页面内存在大量Ajax请求时,为了保证页面完整加载,可以考虑使用waits来等待页面加载完成。
要定位一个元素,Selenium提供了下列的查找元素的方法:
如果要获取多个相同元素(返回list列表),
除了上述的公共方法,还提供了两个私有方法
配合 By
类也可以用来实现上面方法的功能,By
类提供了一组支持的定位策略属性:
上述方法使用参看此处 (对应Selenium WebDriver API参看此处)
以下演示 selenium
查找百度首页按钮元素,边获取元素值
from selenium import webdriver
chromedriver = "D:\ProgramData\pkgs\chromedriver"
driver = webdriver.Chrome(chromedriver)
# driver = webdriver.Chrome() # 设置了chromedriver的环境变量,则此行代码等效于上面两行代码
driver.get("https://www.baidu.com")
# 查找元素
search_btn = driver.find_element_by_id('su') #获取百度首页“百度一下”按钮元素
print search_btn
print search_btn.id
print search_btn.size
print search_btn.tag_name
print search_btn.text
# 获取元素属性值
print search_btn.get_property('type')
print search_btn.get_attribute('class')
print search_btn.get_property('value')
# 获取元素状态
print search_btn.is_displayed()
print search_btn.is_enabled()
print search_btn.is_selected()
# 获取元素css样式
print search_btn.value_of_css_property('font')
print search_btn.value_of_css_property('color')
print search_btn.value_of_css_property('background')
driver.quit()
以下演示 Selenium
实现百度一下操作(用百度查找 “selenium” 相关内容)
from selenium import webdriver
from selenium.webdriver.common.by import By
chromedriver = "D:\ProgramData\pkgs\chromedriver"
driver = webdriver.Chrome(chromedriver)
# driver = webdriver.Chrome() # 设置了chromedriver的环境变量,则此行代码等效于上面两行代码
driver.get("https://www.baidu.com")
# 获取百度首页输入框
search_input = driver.find_element(By.NAME, 'wd')
# 输入框内填写 “selenium”
search_input.send_keys("selenium")
# 获取百度首页“百度一下”按钮
search_btn = driver.find_element(By.ID, 'su')
# 点击按钮,实现表单提交
search_btn.click()
# driver.quit()
获取输入框元素后,使用 send_keys() 方法模拟输入需要查找的内容,之后获取按钮元素,并触发 click() 方法模拟点击事件,以此模拟完成百度搜索功能