【找到官方中文文档,无须个人翻译,可用作参考相关链接】Seleniumg浏览器自动化项目
Selenium浏览器自动化项目
Selenium是一个涵盖了了一些列工具和库的总体项目,这些工具和库允许和支持网站浏览器的自动化。
它提供了模拟用户和浏览器交互的扩展,一个扩展浏览器配置的分布式服务器,以及用于实现 W3C (World Wide Web Consotium 万维网联盟) WebDriver 规范的基础结构,该规范让你可以为所有主流服务器编写可通用的代码。
这个项目是由志愿者贡献的,他们自己投入了数千小时,并使任何人对源代码都可以免费的享用和改进。
Selenium将浏览器供应商、工程师和热衷者聚集在一起,进一步对网络平台自动化进行公开的讨论。这个项目每年组织一次会议教导培育社区。
Selenium的核心是WebDriver,一个可以编写指令集的接口,可以在许多浏览器中通用运行。这是一个你可以做的最简单指令(基于Python)。
from selenium import webdriver #导入selenium模块中的 webdriver子模块
from selenium.webdriver.common.by import By #对结构体成员的引用运算符.
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait #等待页面元素加载完毕
from selenium.webdriver.support.expected_conditions import presence_of_element_located
#This example requires Selenium WebDriver 3.13 or newer
with webdriver.Firefox() as driver:
wait = WebDriverWait(driver, 10)
driver.get("https://google.com/ncr")
driver.find_element(By.NAME, "q").send_keys("cheese" + Keys.RETURN)
first_result = wait.until(presence_of_element_located((By.CSS_SELECTOR, "h3>div")))
print(first_result.get_attribute("textContent")) #??
有关运行此代码时屏幕背后发生的事情的完整解释,请参阅快速导览。你应当继续阅读叙述文档,以便理解怎样安装并成功用Selenium作为自动化测试工具,以及如何将这样的简单测试扩展到可在多个浏览器、多个不同的操作系统上的大型分布式环境运行。
开始
如果你是使用Selenium的新手,我们有一些资源来帮助你立即跟上速度。
快速浏览
Selenium不仅仅是一个工具或应用程序接口,它还包含许多工具。
WebDriver
如果你是从桌面网站或移动网站自动化测试开始的,你将会使用 WebDriver APIs。WebDriver 用浏览器厂商提供的浏览器自动化APIs控制浏览器并运行测试。这就像一个真实的用户正在操作浏览器。因为WebDriver不需要应用程序代码编译它的API,所以它不具有侵入性。因此,你正在测试你实时推送的同一个应用程序。
IDE
集成开发环境是用来开发Selenium测试用例的工具。它是一个易于使用的谷歌和火狐浏览器扩展,通常是开发测试用例的最有效的方式。它用现有的Selenium命令为你记录用户在浏览器上的操作,参数由该元素的上下文定义。这不仅节省时间,而且是学习Selenium脚本语法的卓越方式。
Grid
Selenium Grid 允许你在不同的计算机上跨平台运行测试用例。触发测试用例的控制是在本地端,当触发测试用时,由远程端自动执行。
在WebDriver测试开发后,你可能需要在不同浏览器和操作系统组合上运行测试。这就是Grid出现的地方。
介绍
Selenium是一个涵盖了了一些列工具和库的总体项目,这些工具和库允许和支持网站浏览器的自动化。
Selenium项目和工具
Selenium控制网络浏览器
Selenium有很多功能,但它的核心是一个web浏览器自动化工具集,它使用现有的最佳技术来远程控制浏览器实例并模拟用户与浏览器的交互。
它允许用户模拟终端用户执行的常见活动;在字段中输入文本,选择下拉值和复选框,然后单击文档中的链接。它还提供许多其他控件,如鼠标移动、任意JavaScript执行等等。
尽管Selenium主要用于网站的前端测试,但它的核心是一个浏览器用户代理库。这些接口在它们的应用程序中无处不在,这鼓励了与其他库的组合以满足你的目的。
一个接口控制它们
该项目的指导原则之一是支持所有(主要)浏览器技术的通用接口。网络浏览器是极其复杂的、高度工程化的应用程序,以完全不同的方式执行操作,但执行时通常看起来是相同的。即使文本以相同的字体呈现,图像在相同的位置显示,链接将你带到相同的目的地。下面发生的事情就像白天和黑夜一样不同。Selenium“抽象”了这些差异,对编写代码的人隐藏了它们的细节和复杂性。这允许你编写几行代码来执行复杂的工作流,但这些代码行将在火狐、IE、谷歌和所有其他受支持的浏览器上执行。
工具和支持
Selenium的极简主义设计方法使它具有多功能性,可以作为一个组件包含在更大的应用程序中。Selenium保护伞下提供的周边基础设施为你提供了将浏览器Grid组合在一起的工具,因此可以跨一系列机器在不同的浏览器和多个操作系统上运行测试。
想象服务器机房或数据中心的一组计算机同时启动浏览器,24小时不间断地访问站点的链接、窗体和表来测试应用程序。通过为最常见的语言提供的简单编程接口,这些测试将不知疲倦地并行运行,在出现错误时向你报告。
它旨在通过向用户提供工具和文档来帮助您实现这一点,不仅可以控制浏览器,还可以方便地扩展和部署这样的网格。
谁使用Selenium
世界上许多最重要的公司都采用了Selenium来进行基于浏览器的测试,这往往取代了涉及其他专有工具的多年努力。随着它越来越受欢迎,它的要求和挑战也成倍增加。
随着网络变得越来越复杂,新技术被添加到网站上,这个项目的任务是尽可能地跟上他们。作为一个开源项目,这项支持是通过许多志愿者慷慨奉献时间提供的,每个志愿者都有一份“日常工作”。
该项目的另一个任务是鼓励更多的志愿者参与这项工作,并建立一个强大的社区,以便该项目能够继续跟上新兴技术的发展,并保持为功能测试自动化的主流平台。
历史
当Selenium 1在2004年发布时,就没有必要减少在web应用程序前端手动验证一致性行为所花费的时间。它利用了当时可用的工具,并在很大程度上依赖于将JavaScript注入被测网页来模拟用户的交互。
尽管JavaScript是一个很好的工具,可以让你内省DOM的属性,并进行某些客户端观察,否则你将无法进行这些观察,但它在自然复制用户交互的能力方面还存在不足,就像使用鼠标和键盘一样。
从那时起,Selenium已经成长和成熟了很多,成为一种被世界上许多(如果不是大多数)最大的组织广泛使用的工具。Selenium已经从Thoughtworks为少数群体观众和一个特定用例开发的自制测试自动化工具包,发展为全球事实上的浏览器自动化库。
正如Selenium RC利用了当时可用的行业工具一样,Selenium WebDriver将浏览器交互部分带到浏览器厂商的主页,并要求他们负责面向浏览器的后端实现,从而推动了这一传统。最近,这项工作已经演变成一个W3C标准化过程,其目标是将Selenium中的WebDriver组件转变为用户代理的当日远程控制库。
自动化测试
测试的种类
关于这份文档
Selenium安装
Selenium的设置与其他商业工具的设置大不相同。要在自动化项目中使用Selenium,你需要安装所选语言的语言绑定库。另外你将需要WebDriver二进制文件用于你想要自动化运行并运行测试的浏览器。
安装Selenium库
首先你需要为自动化项目安装Selenium绑定。库的安装过程取决于你所选择使用的语言
Python
用pip为Python语言安装Selenium库
pip install selenium #通过终端安装
或者,你可以下载PyPI 源文档(selenium-x.x.x.tar.gz)并使用setup.py安装
python setup.py install
安装WebDriver二进制文件
要执行你的项目并控制浏览器,你需要安装特定浏览器的WebDriver二进制文件。
下载你的浏览器支持的WebDriver二进制文件并将其放在系统路径中。
安装独立服务器
如果你计划使用Grid,那么应该下载selenium服务器独立JAR文件。所有组件都可以通过selenium服务器获得。独立JAR包含所有内容,包括远程Selenium服务器和客户端绑定。这意味着如果在项目中使用selenium服务器独立jar,则不必添加selenium java或特定于浏览器的jar。
<dependency> #??
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server</artifactId>
<version>3.X</version>
</dependency>
开始使用WebDriver
Selenium通过使用WebDriver支持市场上所有主要浏览器的自动化。WebDriver是一个API和协议,它定义了一个与语言无关的接口来控制web浏览器的行为。每个浏览器都有一个特定的WebDriver实现作为支持,称为驱动程序。驱动程序是负责向下委托给浏览器的组件,并处理与Selenium和浏览器之间的通信。
这种分离是让浏览器供应商负责实现浏览器的有意努力的一部分。Selenium在可能的情况下使用这些第三方驱动程序,但也提供了由项目维护的自己的驱动程序,以便在不现实的情况下使用。
Selenium框架通过面向用户的界面将所有这些部分连接在一起,使不同的浏览器后端能够透明地使用,从而实现跨浏览器和跨平台的自动化。
更多关于驱动程序的细节请参阅驱动程序特质。
浏览器
第三方驱动程序和插件
WebDriver
WebDriver像用户本地或使用Selenium服务器的远程计算机一样以本机地方式驱动浏览器,标志着浏览器自动化的飞跃,为了浏览器自动化标记一大步。
Selenium WebDriver 既指语言绑定,也指单个浏览器控制代码的实现。这通常仅称为WebDriver。
Selenium WedDriver 是W3C推荐的
- WebDriver 被设计成简单并更简洁的编程界面
- WebDriver 是一个紧凑的面向对象的应用程序接口
- WebDriver 有效地驱动浏览器
了解组件
使用WebDriver构建测试套件需要你理解并有效地使用许多不同的组件。就像软件中的所有东西一样,不同的人对同一个想法使用不同的术语。下面是如何在这个描述中使用术语的细分条目。
术语
- 应用程序编程接口:这是一组用于操纵WebDriver的“命令”。
- 库:一个代码模块,包含APIs和实现它们所需的代码。库特定于每种语言绑定,例如.jar文件用于Java,.dll文件用于.NET等。
- 驱动程序:负责控制实际浏览器。大多数驱动程序都是由浏览器供应商自己创建的。驱动程序通常是通过浏览器本身在系统上运行的可执行模块,而不是在执行测试套件的系统上。(尽管它们可能是统一系统。)注意:有些人将驱动程序称为代理。
- 框架:用于支持WebDriver套件的附加库。这些框架可能是测试框架,比如JUnit或NUnit。它们也可能是支持自然语言特性的框架,比如Cucumber或Robotium。框架也可以被编写并用于操作或配置被测系统、数据创建、测试预言等。
零部件
至少,WebDriver通过驱动程序与浏览器对话。通信是双向的:WebDriver通过驱动程序将命令传递给浏览器,并通过相同的路径接收信息。
Host System
Driver
WebDriver
Broswer
这个驱动程序是特定于浏览器的,比如ChromeDriver用于Google的Chrome/Chromium,GeckoDriver用于Mozilla的Firefox等等。这个驱动程序和浏览器运行在同一个系统上。这可能是,也可能不是,测试本身正在执行的同一个系统。
上面这个简单的例子就是直接交流。与浏览器的通信也可以是通过Selenium服务器或RemoteWebDriver进行的远程通信。RemoteWebDriver与驱动程序和浏览器在同一系统上运行。
Host System
Driver
Remote WebDriver
Broswer
WebDriver
远程通信也可以通过使用Selenium服务器或Selenium网格产生,服务器和Selenium网格反过来与主机系统上的驱动程序进行通信。
Host System
Broswer
Driver
WebDriver
Selenium Server or Grid
框架适用的地方
WebDriver有且仅有一项工作:通过上述任何方法与浏览器通信。WebDriver对测试一无所知:它不知道如何进行比较、断言pass或fail,当然也不知道关于报告或Given/When/Then语法的知识。
这就是各种框架发挥作用的地方。你至少需要一个与语言绑定相匹配的测试框架,例如NUnit 相对于.NET、JUnit 相对于 Java、RSpec 相对于 Ruby等等。
测试框架负责运行和执行WebDriver以及测试中的相关步骤。因此,您可以认为它看起来类似于下图。
Host System
Test Framework
Broswer
Driver
WebDriver
Selenium Server or Grid
自然语言框架/工具(如Cucumber)可能作为上图中测试框架框的一部分存在,或者它们可以将测试框架完全封装在自己的实现中。
《驱动程序要求》
凭借WebDriver,Selenium支持市场上所有主要浏览器,如Chrom(ium)、Firefox、Internet Explorer、Opera和Safari。在可能的情况下,WebDriver使用浏览器内置的自动化支持来驱动浏览器,尽管并非所有浏览器都有官方的远程控制支持。
WebDriver的目标是尽可能地模拟真实用户与浏览器的交互。在不同的浏览器中,这在不同的级别上是可能的。有关不同驱动特质的更多详细信息,请参阅驱动特质。
尽管所有驱动程序共享一个面向用户的界面来控制浏览器,但它们设置浏览器会话的方式略有不同。由于许多驱动程序实现是由第三方提供的,因此它们不包括在标准的Selenium发行版中。
驱动程序实例化、配置文件管理和各种浏览器特定设置是根据浏览器具有不同要求的参数示例。本节介绍了开始使用不同浏览器的基本要求。
向路径中添加可执行文件
大多数驱动程序需要一个额外的可执行文件,以便Selenium与浏览器通信。你可以在启动WebDriver之前手动指定可执行文件的位置,但这会降低测试的可移植性,因为可执行文件需要在每台计算机上的同一位置,或者将可执行文件包含在测试代码存储库中。
通过将包含WebDriver二进制文件的文件夹添加到系统路径中,Selenium将能够定位其他二进制文件,而无需测试代码来定位驱动程序的确切位置。
- 创建一个目录来放置可执行文件,如C:\WebDriver\bin 或 /opt/WebDriver/bin
- 将目录添加到你的路径:
macOS和Linux上的Bash用户-在终端中:
export PATH=$PATH:/opt/WebDriver/bin >> ~/.profile # export用于设置或显示环境变量;>>的意思是将输出内容追加到目标文件中。如果文件不存在,就创建文件;如果文件存在,则将新的内容追加到那个文件的末尾,该文件中的原有内容不受影响。
现在可以测试你所做的更改了。关闭所有“打开”命令提示,然后打开一个新提示。在上一步中创建的文件夹中键入其中一个二进制文件的名称,例如:chromedriver
如果Path
配置正确,你将看到一些与驱动程序启动相关的输出:
Starting ChromeDriver 2.25.426935 (820a95b0b81d33e42712f9198c215f703412e1a1) on port 9515
Only local connections are allowed.
按Ctrl+C可以重新控制命令提示符
快速参考
Browser | Supported OS | Maintained by | Download | Issue Tracker |
FireFox | Windows/macOS/Linux | Mozilla | ||
Safari | macOS EI Capitan and newer | Apple | Built in |
快速参考
Firefox
从Selenium 3开始,Mozilla已经接管了Firefox驱动程序的实现,使用geckodriver。Firefox的新驱动程序名为geckodriver,适用于Firefox 48及更高版本。由于Firefox WebDriver正在开发中,Firefox版本越新,支持就越好。
由于geckodriver是启动Firefox的新默认方式,你可以用与Selenium 2相同的方式实例化Firefox(基于Python):
#Simple assignment
from selenium.webdriver import Firefox
driver = Firefox()
#Or use the context manager
from selenium.webdriver import Firefox
with Firefox() as driver:
#your code inside this indent
如果你不想使用PATH设置geckodriver的位置,可通过编程方式设置geckodriver二进制文件的位置(基于Python):
Firefox(executable_path='/path/to/geckodriver')
也可以在运行时设置属性:
mvn test -Dwebdriver.gecko.driver=/path/to/geckodriver
通过安装 Firefox 47.0.1 或 45 ESR 并将所需的marionette功能指定为false,目前可以恢复到更老、功能更完整的Firefox驱动程序。Firefox的更高版本不再兼容。
Safari
High Sierra 及更新版本:
- 第一次从终端运行以下命令,并在提示符下键入密码以授权WebDriver
safaridriver --enable
EI Capitan 和 Sierra
- 从Safari偏好设置中启用“开发者”菜单
- 在“开发”菜单中选中允许远程自动化选项
- 第一次从终端运行以下命令,并在提示符下键入密码以授权WebDriver
/usr/bin/safaridriver -p 1337</
然后,你可以使用以下命令启动驱动程序会话(基于Python):
#Simple assignment
from selenium.webdriver import Safari
driver = Safari()
#Or use the context manager
from selenium.webdriver import Safari
with Safari() as driver:
#your code inside this indent
那些希望在iOS上实现Safari自动化的人应该去Appium项目。 尽管Safari以前可用于Windows,但苹果早就放弃了对它的支持,这使其成为测试平台的不佳选择。
浏览器操作
浏览器导航
导航至
启动浏览器后,首先要做的是打开网站。这可以通过一行代码来实现:
driver.get("https://selenium.dev")
获取当前URL
你可以使用以下方法从浏览器的地址栏读取当前URL:
driver.current_url
返回
按浏览器的后退按钮:
driver.back()
前进
按浏览器的“前进”按钮:
driver.forward()
刷新
刷新当前页面:
driver.refresh()
获取标题
你可以从浏览器中读取当前页面标题:
driver.title
窗口和选项卡
获取窗口句柄
WebDriver不区分窗口和选项卡。如果你的站点打开了一个新的选项卡或窗口,Selenium将允许你使用窗口句柄来处理它。每个窗口都有一个唯一的标识符,该标识符在单个会话中保持不变。可以使用以下方法获取当前窗口的窗口句柄:
driver.current_window_handle
定位元素
WebDriver Bidi 接口
等待
支持类
JavaScript
Http
页面加载策略
网络元素
键盘
远程WebDriver
指导
糟糕的练习
Grid
Selenium Grid 允许通过将客户端发送到远程浏览器实例的路由命令,在远程机(虚拟或真实)上执行WebDriver脚本。它旨在提供一种在多台机器上并行运行测试的简单方法。
Selenium Grid 允许我们在多台机器上并行运行测试,并集中管理不同浏览器版本和浏览器配置(而不是在每个单独测试中管理)。
Selenium Grid 并不是完美的解决方案。它解决了一部分常见的委派和分发问题,但例如,它不能管理你的基础结构,可能不能满足你的特定需求。
请注意Grid 3已不再被支持,Selenium项目建议使用Grid 4
驱动特质
分享功能
驱动特功能
驱动程序特质
支持包
字体问题
Selenium官方文档英文原版