把手教您认识、搭建和使用Selenium WebDriver
什么是Selenium?
作为一个开源的自动化测试框架,Selenium可以在不同的浏览器和平台上执行应用测试。其主要特征包括:
- Selenium支持包括:Java、Python、C#、JavaScript、Ruby、PHP和Perl在内的多种编程语言。
- Selenium测试可以在诸如:Firefox、Chrome、Internet Explorer、Safari、以及Opera等多种浏览器上执行。
- Selenium与平台无关,也就是说,如果您在Windows系统上编写的Selenium测试,完全可以被轻松地执行在Linux或macOS上。
- Selenium具有广泛的社区,可以随时获得各种技术支持。
- 并行测试是Selenium的主要功能之一。
Selenium的组成
如前所述,由于Selenium是一个框架,而不是单个软件,因此它是由不同组件所组成的套件。如下图所示,Selenium套件具有四个主要部分:
Selenium IDE
Selenium IDE(集成开发环境)是一种简单易学的框架。它可以作为Mozilla Firefox和Google Chrome的浏览器插件。您无需具备任何编程语言方面的经验,即可使用该IDE。通过它提供的记录和回放方法,您可以记录测试的步骤,并导入自己的首选编程语言,进而使用Selenium WebDriver来开展各项测试。因此,为了创建测试原型,您可以从Selenium官方网站-- https://www.selenium.dev/selenium-ide/,下载Selenium IDE。
Selenium RC
Selenium RC是一种服务器,它让用户能够用任何被支持的语言,来创建测试脚本。与Selenium IDE不同,它没有记录和回放功能,但支持并行和远程的方式被执行。作为Selenium1.0,它自身的诸多限制与缺陷,直接催生了Selenium WebDriver。
Selenium WebDriver
Selenium WebDriver克服了Selenium RC的局限性。与Selenium RC不同的是,Selenium WebDriver不需要依赖JavaScript,即可通过直接通信来控制浏览器。与IDE和RC相比,它具有更快的执行时间,有时也被称为Selenium 2.0。鉴于其强大的功能,Selenium WebDriver被广泛地使用在创建自动测试用例的场景中。
Selenium Grid
通过与Selenium RC的配合使用,Selenium Grid能够方便用户在不同的浏览器和计算机上执行并行测试。也就是说,用户可以在多个环境中同时运行并行测试,进而节省了大量的时间。Selenium Grid启用了集线器节点的概念,实现了每个节点都能够从位于中心处的集线器上接收命令。
Selenium WebDriver与Selenium RC不同之处
Selenium WebDriver和Selenium RC之间的区别主要体现在如下方面:
架构上的差异
与Selenium RC相比,Selenium WebDriver的架构更简单。WebDriver通过操作系统来控制浏览器。也就是说,在使用WebDriver时,您只需要将编程语言与浏览器的驱动程序绑定即可。而Selenium RC则要求在运行测试之前,先运行Selenium的远程控制服务器。
Selenium RC实际上充当的是Selenium代码和浏览器之间的中间层,它能够将Selenium Core(一种Javascript程序)注入浏览器,以便其内核通过RC服务器,接收由程序给出的指令。RC服务器在收到浏览器的响应后,会直接将结果显示给最终用户。
执行速度上的差异
在Selenium RC中,每条指令都需要遵循冗长的处理过程,而在Selenium WebDriver中,它们可以通过直接交互,来缩短整个生命周期。具体而言:
- Selenium WebDriver直接与浏览器交互,并调用浏览器引擎来对其进行控制,因此执行的速度非常快。
- Selenium RC需要首先将Selenium命令转换为控制Web浏览器的Selenium Core,因此执行的速度较慢。
互动上的差异
- Selenium WebDriver通过直接与Web浏览器通信,来模仿真实际使用中的交互。例如:如果某些Web元素被隐藏或禁用,那么WebDriver将无法像普通用户那样找到它们。
- Selenium RC使用与JavaScript代码相似的Selenium Core。该核心可以访问到被隐藏或禁用的元素。因此,即使我们使用Selenium RC在UI上禁用了某些文本框,用户仍然可以进行输入。
API上的差异
- Selenium RC的API命令较为复杂。例如,click、mouseDown、以及mouseDownAt三者很容易被引起混淆;而type与typeKeys也是如此。此外,不同的浏览器对这些命令的解释也不尽相同。因此,在正确的位置选择正确的命令,对于用户来说成为了一项艰巨的任务。
- Selenium WebDriver的API则非常简单易用。
对浏览器支持的差异
- Selenium WebDriver支持headless的HTMLUnit浏览器。此处的headless表示没有UI显示,各种命令会通过不可见的浏览器来执行。
- Selenium RC并不支持headless浏览器。
Selenium WebDriver的架构
如上图所示,Selenium WebDriver包含四个主要组件:
Selenium客户库/Selenium语言绑定
为了支持多种语言,Selenium开发人员已经构建了各种语言绑定。也就是说,如果您正在用Java来编写测试,那么就可以使用Java绑定。而且,这些客户端的库,完全可以从Selenium官方网站处进行下载。
JSON传输协议(Wire Protocol)
JSON是JavaScript Object Notation的缩写形式。它能够在客户端和服务器之间传输数据。由于JSON能够为对象和数组之类的数据结构提供支持,因此方便了数据的读取和写入。它往往充当REST API,实现HTTP服务器之间的信息传输。
浏览器驱动
为了与浏览器建立安全的连接,Selenium会用到驱动程序。每一种浏览器都会使用自己的驱动程序,来隐藏内部功能的逻辑。此外,每一种自动化语言也都有其对应的浏览器驱动。因此,各种脚本在被执行时,通常:
- 每个Selenium命令都会生成一个相应的HTTP请求,该请求将会被发送到浏览器驱动程序处。
- 该请求会通过HTTP服务器进行路由。
- HTTP服务器在浏览器上,驱动指令的执行。
- 浏览器将状态发送回给HTTP服务器,并将其转发给自动化脚本。
上文提到的浏览器驱动程序包括:ChromeDriver、GeckoDriver、以及IEDriver等。它们大多可以从GitHub存储库中被下载到。
浏览器
浏览器是我们执行测试的终点。Selenium能够支持诸如:Firefox、Chrome、Internet Explorer、以及Safari等主流浏览器。
Selenium WebDriver的下载、安装和设置
下面,我们来看看如何使用Windows操作系统,将Java作为编程语言,以Eclipse作为IDE,完成Selenium WebDriver的下载、安装和设置。
安装Java
步骤1:从Java官网--https://www.oracle.com/java/technologies/javase-jdk14-downloads.html查找并下载Windows 64位的JDK安装程序。
步骤2:在弹出的窗口中接受许可协议,并单击“下载”。
步骤3:完成后,请到下载文件夹中双击可执行文件,以安装Java。
设置环境变量
步骤1:打开电脑的设置,从“系统”对话框窗口中选择“高级系统设置”。
步骤2:在弹出的窗口中单击“环境变量”按钮。
步骤3:在“系统变量”处双击“路径”。
步骤4:根据系统对应的位置,添加Java安装目录的完整路径,并单击OK。
步骤5:验证是否已安装Java和正确地设置了变量。请打开“命令提示符”并键入:java -version。您将可以看到在系统中新安装的Java版本。
安装Eclipse
步骤1:从Eclipse官网--https://www.eclipse.org/downloads/packages/查找并下载适合Java开发人员专用的Eclipse IDE(最好是最新的稳定版)。
步骤2:下载完成后,请其解压缩到适当的位置。
步骤3:在生成的文件夹中双击eclipse.exe。
下载Selenium WebDriver并设置
步骤1:访问Selenium官网--https://www.selenium.dev/downloads/。
步骤2:针对列表中的Selenium Client和WebDriver Language Bindings,请下载与自己语言首选项相对应的客户端库。本文以Java客户端为例。
步骤3:将下载的文件解压缩到某个目标文件夹中,以便后续使用。
步骤4:找到对应的目标文件夹。
步骤5:打开文件夹后,您将能够看到一些jar文件,一个libs文件夹(其中包含了更多的jar文件)和一个Changelog文件。
步骤6:为浏览器下载驱动程序。下面是三大主流浏览器驱动的下载链接:
- GeckoDriver(Firefox)-- https://github.com/mozilla/geckodriver/releases
- InternetExplorerDriver-- https://selenium-release.storage.googleapis.com/index.html
- ChromeDriver-- https://sites.google.com/a/chromium.org/chromedriver/
您也可以通过参考Selenium网站上的“浏览器”部分,以下载更多浏览器驱动。
步骤7:解压已下载的驱动,将其存放在到方便的位置。
为Selenium WebDriver配置Eclipse
步骤1:启动eclipse.exe。
步骤2:手动选择工作区,或保持默认位置,然后单击“确定”。
步骤3:根据向导,依次点击“文件”->“新建”->“Java项目”,以创建一个新的项目。
步骤4:点击“下一步”,为项目命名,并单击完成。
步骤5:在新建的项目上右键,选择“新建”->“包”。
步骤6:在“新建Java包”对话框中输入包的名称,然后单击“完成”。
步骤7:右击新建包的名称,依次选择“新建”->“类”。
步骤8:在“新建Java类”对话框中,输入类的名称,在方法根(method stub)处,勾选“public static void main(String [] args)”,然后单击“完成”。
您的资源管理器看上去会与下图类似:
步骤9:在当前项目上右击,依次选择“构建路径”->“配置构建路径”。
第10步:单击“添加外部JAR”,然后定位到已下载保存的JAR文件。
步骤11:依次选择Selenium Client文件夹中的两个jar,以及libs文件夹里的jar文件。
步骤12:添加完毕后,您将在Libraries下看到所有的jar文件:
步骤13:依次点击“应用”->“OK”。此时,您将在“包管理器”下看到所有的“引用库”。
至此,我们已成功地在Eclipse Project中配置了Selenium WebDriver。
使用Selenium WebDriver执行第一个测试脚本
我们将编写一个简单的测试程序,该程序将启动Firefox浏览器,并打开“www.google.com”,在将浏览器最大化窗口后,最后退出会话。我们在代码中将写入前文在配置Selenium时创建的测试类。具体代码段如下:
Java
package firstPackage; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class MyFirstTestClass { public static void main(String[] args) throws InterruptedException { System.setProperty("webdriver.gecko.driver","E:\\Softwares\\geckodriver.exe”); WebDriver driver = new FirefoxDriver(); driver.get("https://www.google.com/"); driver.manage().window().maximize(); Thread.sleep(5000); driver.quit(); } }
代码说明:
System.setProperty(“webdriver.gecko.driver”,”E:\\Softwares\\geckodriver.exe”)
这行代码用于设置浏览器的属性,即:将系统的属性设置为给定值。WebDriver代码将引用存储在第二个参数中所在路径里的驱动,并实例化Firefox驱动。注意,您需要提供的是存储驱动程序的系统路径。
WebDriver driver = new FirefoxDriver()
我们通过引用WebDriver接口,来创建Firefox类的对象(Object)。也就是说,我们可以在Firefox实例中实现WebDriver的方法。
driver.get(“https://www.google.com/”)
WebDriver的get()方法可以被用于打开URL,并等待页面的完全加载。
driver.manage().window().maximize()
maximum()方法可实现浏览器窗口的最大化。
Thread.sleep(5000)
为了使实例在网络连接速度过慢的情况下不会超时,我们可以通过休眠,使线程的执行暂停指定的毫秒数(括号中的数值)。
driver.quit()
quit()方法用于终止WebDriver会话,并关闭由WebDriver所启动的浏览器窗口。
在执行了上述代码后,您将会在Eclipse Console窗口中看到如下执行日志。而在执行测试时,您也会观察到浏览器窗口随着Google的启动,并在随后自行关闭。
至此,您已经成功地执行了第一个Selenium WebDriver测试脚本。当然,您也可以试着使用其他浏览器驱动来编写不同的测试脚本。
Selenium WebDriver的局限性
如前所述,Selenium WebDriver在取代RC方面有着诸多优势。不过客观地说,它也存在着如下局限性:
i. Selenium WebDriver不支持基于Windows的应用程序自动化。
ii. Selenium WebDriver无法自动执行图像测试、提供验证码或OTP功能。
iii. Selenium WebDriver没有任何内置的报告。
iv. 由于它是开源的,因此您必须依靠社区论坛,来解决各种技术问题。
v. 在使用Selenium WebDriver自动化之前,您需要至少具有一门编程语言的基础知识。
vi. Selenium中没有用于“测试管理”的测试集成工具。
vii. Selenium WebDriver不支持并行测试。这对于大型且复杂的测试套件而言,是一种严重的不足。