Selenium
Selenium 是一套跨平台的浏览器自动化测试框架(工具),支持在多种系统环境、多种浏览器环境下使用,还可以使用多种编程语言来编写测试。
Selenium
有多个项目构成,形成了一个多功能的测试系统:
- Selenium Core:支持DHTML 的测试案例(效果类似数据驱动测试),它是Selenium IDE 和Selenium RC
的引擎。 - Selenium Grid - 允许您在不同的计算机上并行运行不同浏览器的测试。也就是说,针对运行不同浏览器和操作系统的不同计算机同时运行多个测试。从本质上讲,Selenium-Grid支持分布式测试执行。它允许在分布式测试执行环境中运行测试。
- Selenium IDE - 用于开发Selenium测试用例的工具。它是一个易于使用的Chrome和Firefox扩展,通常是开发测试用例的最有效方式。它使用现有的Selenium命令为您在浏览器中记录用户操作,并使用该元素的上下文定义参数。这不仅节省了时间,而且是学习Selenium脚本语法的绝佳方式。
- Selenium RC (Selenium Remote Control) - 是一个客户端/服务器系统,允许您使用几乎任何编程语言和测试框架在本地或其他计算机上控制Web浏览器。
- Selenium WebDriver - 主要新功能是集成WebDriver API。除了解决Selenium-RC API中的一些限制之外,WebDriver还旨在提供更简单,更简洁的编程接口。Selenium-WebDriver的开发是为了更好地支持动态网页,页面元素可能会在不重新加载页面的情况下发生变化。WebDriver的目标是提供精心设计的面向对象的API,为现代高级Web应用程序测试问题提供改进的支持。
注意:如出现Selenium官网访问缓慢,可以在 C:\Windows\System32\drivers\etc\hosts
文件内添加如下内容后尝试
172.217.31.243 www.seleniumhq.org
Selenium 1.0
Selenium 1.0(又名,Selenium RC 或 Selenium Remote Control) 发布于2004年,基本构成如下:
Selenium 1构成主要的两个组件为:
-
Selenium RC Server - 解释并运行从测试程序传递的
Selenese
命令(Selenese 是 Selenium命令集合),并充当HTTP代理,拦截和验证在浏览器和AUT之间传递的HTTP消息。 - Client libraries - 提供每种编程语言和Selenium RC Server之间的接口。
简化的架构图如下:
Selenium 1 简化架构图Selenium 2.0
Selenium 2 = WebDriver + Selenium 1
Selenium 2.0发布于2011年,是Selenium 1.0与Selenium WebDriver合并而成的一款性能更佳的产品。
Selenium 2WebDriver是一种用于自动化Web应用程序测试的工具,尤其是用于验证它们是否按预期工作。它旨在提供一个易于探索和理解的友好API,比Selenium-RC(1.0)API更易于使用,这将有助于使您的测试更易于阅读和维护。它不依赖于任何特定的测试框架,因此它可以在单元测试项目中使用。
Selenium 2.0 具有来自 WebDriver 的清晰面向对象 API,并能以最佳的方式与浏览器进行交互,更多Selenium WebDriver的API接口操作可以查看此处。该版本中主推WebDriver,可以将其看做 Selenium RC 的替代。因为要保持向下兼容,Selenium 2.0 中并没有彻底放弃 Selenium RC。
Selenium 3.0
Selenium 3Selenium 3.0首次发布于 2016年5月,主要有如下更新:
- 停止使用 Selenium core (放弃Selenium RC)
- 需要更高的Java版本支持(Java 8+)
- 不再默认支持Firefox驱动程序(Mozilla推出Gecko Driver)
- 使用W3C新标准的WebDriver
- 浏览器供应商自己的WebDriver实现
三个版本关系大致如下:
Selenium 三个版本更替Selenium与浏览器driver
为了实现Selenium对浏览器的操作,针对几款主流的浏览器,提供了对应的 driver
浏览器driver | 地址 |
---|---|
Chrome - ChromeDriver | github 下载地址1 下载地址2 |
Firefox - GeckoDriver | github 下载地址 |
Edge - Microsoft WebDriver | github 下载地址 |
Safari - WebDriver | source |
其他浏览器Driver
|
此处下载 |
Selenium webdriver 模拟 Chrome 浏览器操作
对于 Selenium 的这里仅作简略介绍,大家可以参看官方文档或类似书籍来学习。下面通过一些小示例,简单记录在 Windows 10
、Python 2.7.15
、Selenium 3.14.1
、Chrome 71.0.3578.80
环境下,Selenium webdriver API 驱动 Chrome 浏览器操作的过程。
Chrome浏览器及chromedriver版本对应
要 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。更多版本查看此处。
Python安装Selenium
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
chromedriver 下载及配置
下载对应当前 Chrome
浏览器版本的 chromedriver
,在任意目录解压后,将解压后的路径配置到环境变量中方便程序中直接引用。
注意:64位浏览器下载32位driver即可。
注意: 操作不同浏览器,需要下载对应浏览器版本的driver,并添加driver路径到环境变量中,否则运行代码时,会出现类似
selenium.common.exceptions.WebDriverException: Message: 'xxxdriver' executable needs to be in PATH.
的异常提示
Selenium webdriver实例化及页面访问
以下演示 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 webdriver API 获取页面元素
要定位一个元素,Selenium提供了下列的查找元素的方法:
- find_element_by_id - 查找对应id的元素
- find_element_by_name - 查找对应名称的元素
- find_element_by_xpath - 查找对应xpath的元素
- find_element_by_link_text - 查找对应超链接文本的元素
- find_element_by_partial_link_text - 查找含有超链接文本的元素
- find_element_by_tag_name - 查找对应标签名的元素
- find_element_by_class_name - 查找对应类名的元素
- find_element_by_css_selector - 查找对应css选择器的元素
如果要获取多个相同元素(返回list列表),
- find_elements_by_name
- find_elements_by_xpath
- find_elements_by_link_text
- find_elements_by_partial_link_text
- find_elements_by_tag_name
- find_elements_by_class_name
- find_elements_by_css_selector
除了上述的公共方法,还提供了两个私有方法
配合 By
类也可以用来实现上面方法的功能,By
类提供了一组支持的定位策略属性:
- CLASS_NAME = 'class name'
- CSS_SELECTOR = 'css selector'
- ID = 'id'
- LINK_TEXT = 'link text'
- NAME = 'name'
- PARTIAL_LINK_TEXT = 'partial link text'
- TAG_NAME = 'tag name'
- XPATH = 'xpath'
上述方法使用参看此处 (对应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 webdriver API 页面表单操作
以下演示 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() 方法模拟点击事件,以此模拟完成百度搜索功能
chromedirver 实现百度搜索
网友评论