请参考Selenium栅格Web站点
注释:目前我们正在这一章上工作。此处我们为Selnium-Grid的完全的新手提供了一些介绍性的信息。在接下来的几个月,我们希望提供有用的示例和演示,以彻底地说明如何使用Selnium-Grid。
快速入门
如果你已经体验过Selenium测试自动化,你可能仅仅需要一个快速入门来起步和运行。这一章有许多适用于不同技术水平的信息,但如果你只是在寻找一个快速参考为了快速地尝试一下,就可能显得有点太多了。为了快速入门,请参考在Selenium Wiki的Selenium-Grid文章。
Selenium-Grid是什么?
Selenium-Grid允许你在不同的机器上,针对不同的浏览器并行地运行你的测试。也就是说,在同一时间,在运行不同浏览器和操作系统的机器上,运行多个测试。本质上,就是Selenium-Grid支持分布式测试执行。它允许在分布式测试执行环境运行你的测试。
何时使用
一般来说,你想要使用Selenium-Grid可能有两个原因。
Selenium-Grid用于通过使用多台机器并行地运行测试,以加速测试执行的时间。例如,你有一个包含100测试的测试集,但你搭建Selenium-Grid以支持四台不同的机器(虚拟机或不同的物理机器)运行这些测试,你的测试集大概,以你顺序地、在单一的机器上,运行你的测试所花的时间的1/4的时间完成。对大的测试集,和诸如执行大量的数据验证的长时间运行的测试集,这可以显著地节省时间。某些测试集的运行可能需要花费数小时。另一个提高运行测试集花费的时间的理由是,可以缩短开发者为AUT检入代码后,为获取测试结果而花费的周转时间。越来越多的采用敏捷软件开发的团队,想要尽可能快地立即得到测试反馈,而非为一个通宵的测试等待整夜。
Selenium-Grid也用于支持针对多个运行环境运行测试,特别是,在相同的时间针对不同的浏览器。例如,一个虚拟机的栅格,每一个支持在一个不同的浏览器上进行应用程序测试。如,机器1有Internet Explorer 8,机器2有Internet Explorer 9,机器3是最新的Chrome,机器4是最新的Firefox。当测试集运行时,Selenium-Grid接受每个测试-浏览器的组合,并分派每个测试运行在它要求的浏览器上。
此外,也可以有一个具有相同的浏览器,类型和版本的浏览器的栅格。例如,一个人可以有四台机器的栅格,每个运行Firefox 12的三个实例,允许一个可用的Firefox实例的(在某种意义上)“服务器场”。当测试集运行时,Selenium-Grid分配每个测试到下个可用的Firefox实例。以这种方式,可以想象,会同时并行地运行12个测试,可以显著地减少完成测试需要的时间。
Selenium-Grid是非常灵活的。以上两个示例可以组合,允许每种类型和版本的浏览器的多个实例。这样的一个配置,会同时提供并行执行的快速完成测试,以及对多浏览器类型和版本的支持。
Selenium-Grid 2.0
Selenium-Grid 2.0是在编写此文档时(5/26/2012)的最新版本。与Selenium-Grid的第一个版本差别很大。在2.0版中,Selenium-Grid已经与Selenium-RC服务器合并。现在你只需要下载一个单一的.jar文件,远程Selenium-RC-Server和Selenium-Grid都在一个包里。
Selenium-Grid 1.0
版本1是Selenium-Grid的第一个发布。如果你是Selenium-Grid的新手,你应该使用版本2。版本2已经更新,有许多新的特征,并支持Selenium-WebDriver。不敢怎样,遗留的测试系统可能仍然需要使用版本1。有关Selenium-Grid版本1的信息,可以在Selenium-Grid的Web站点找到。
Selenium-Grid是如何与集中器和节点一起工作的
一个栅格是由一个单一的集中器,和一个或多个节点组成的。两者的启动都使用selenium-server.jar可执行文件。我们在本章的后边部分列出了一些示例。
集中器接受一个等待执行的测试,带有测试应该运行在那个浏览器和那个“平台”(诸如,WINDOWS,LINUX等等)的信息。集中器知道已经注册到集中器的每一个节点的配置。使用配置信息,集中器可以选择有请求的浏览器-平台组合的可用节点。一旦一个节点被选择,由测试启动的Selenium命令就被发送给集中器,然后传递给分配给那个测试的节点。节点运行浏览器,并针对要测试的应用程序,在浏览器内执行Selenium命令。
图示如下。参见在本页的第二图(第一图演示Selenium-RC)。第二图是Selenium-Grid 1,然而它仍然适用,而且是我们在这里描述的内容的极好的图示。唯一的差别是一个术语。替代用术语“Selenium-Grid节点”替代术语“Selenium远程控制(Selenium Remote Control)”,该图将匹配我们对Selenium-Grid 2的描述。
安装
安装是简单的。从SeleniumHq站点的下载页,下载Selenium服务器jar文件。你想要的链接在这一节“Selenium服务器(以前的Selenium-RC)”。
安装它到一个你选择的文件夹。你需要确认该java可执行文件在你的可执行路径上,以便你可以从命令行运行它。如果你不能正确地运行,验证你的系统路径变量包含java.exe的路径。
启动Selenium-Grid
一般地,你会首先启动一个集中器,因为节点依赖于一个集中器。然而,这不是绝对必需的,因为节点在一个集中器启动后会识别出来,反之亦然。为了学习的目的,首先启动集中器会比较容易,否则你可能会碰到,你首次使用Selenium-Grid时不希望看到的错误消息。
启动一个集中器
要使用默认的参数启动一个集中器,从命令行shell运行下面的命令。这将在所有支持的平台,Windows,Linux或MacOs上工作。
java -jar selenium-server-standalone-2.21.0.jar -hub这会使用默认的参数值启动一个集中器。在下边的子节中,我们会解释这些参数。注意,依赖于你正在使用的Selenium服务器的版本,你可能需要改变上边命令的jar文件名称的版本号。
启动一个节点
要启动一个使用默认参数的节点,从命令行运行下面的命令。
java -jar selenium-server-standalone-2.21.0.jar -role node -hub http://localhost:4444/grid/register这假定集中器已经使用默认的参数启动。集中器使用于侦听新的请求的默认端口是4444。这就是为什么在URL中,端口4444被使用于定位集中器的原因。同样地,使用“localhost”是假定你的节点正运行在与你的集中器相同的机器上。对于起步阶段,这可能是最容易的。如果运行的集中器和节点在不同的机器上,只需要用运行集中器的远程机器的主机名称替代“localhost”。
警告:确信关闭运行你的集中器和节点的机器的防火墙。否则你可能会得到连接错误的信息。
配置Selenium-Grid
缺省配置
JSON配置文件
通过命令行选项配置
集中器配置
要使用缺省选项运行集中器,只需要为Selenium服务器指定-role hub
java -jar selenium-server-standalone-2.21.0.jar -hub你应该会看到下面的日志输出。
Jul 19, 2012 10:46:21 AM org.openqa.grid.selenium.GridLauncher main
INFO: Launching a selenium grid server
2012-07-19 10:46:25.082:INFO:osjs.Server:jetty-7.x.y-SNAPSHOT2012-07-19
10:46:25.151:INFO:osjsh.ContextHandler:started o.s.j.s.ServletContextHandler{/,null}2012-07-19
10:46:25.185:INFO:osjs.AbstractConnector:Started [email protected]:4444
指定端口
集中器使用的默认端口是4444。该侦听端口是一个TCP/IP端口,是当“客户”,也就是说,连接到Selenium-Grid集中器的自动化测试使用的。如果在你的计算机上的另外一个应用程序已经使用了这个端口,或者如果,你已经有一个启动的Selenium服务器,你会在日志输出中,看到下面的消息。
10:56:35.490 WARN - Failed to start: [email protected]:4444线程中的异常
如果出现这种情况,你可以关闭那个使用端口4444的进程,或者告诉Selenium-Grid为集中器使用一个不同的端口。使用-port选项用于改变集中器使用的端口。
java -jar selenium-server-standalone-2.21.0.jar -hub -port 4441这将工作良好,即时有另外一个集中器已经运行在这个相同的机器,也就是说,只要它们两个不都使用端口4441。
你可能,不管怎样,想要看看什么进程正在使用端口4444,以便你可以允许集中器使用这个默认端口。
要看看所有在你的机器上正在运行的程序都在使用什么端口,可以使用命令:netstat -a
这应该是可行的,在所有支持的系统,Unix/Linux,MacOs和Windows,虽然除了-a之外的附加选项可能是需要的。基本上,你需要显示进程ID连同某个端口,在Unix你可以“grep”输出(使用一个管道符)来仅仅显示那些你关注的记录。
节点配置
时序参数
获取命令行参数
Selenium服务器提供了带有简短描述的可用选项的列表。目前(2012夏天),命令行帮助有点古怪,但它可能是有帮助的,如果你知道到哪里可以找到和如何解释这些信息。
Selenium服务器提供了两个截然不同的功能,Selenium-RC服务器和Selenium-Grid。它们很可能是由不同的Selenium团队编写的,因此为每个功能的命令行帮助可能截止在两个不同的地方。对新用户来说,当你首次查看两个中的一个时,这可能不是非常明显的。
如果你只是传递-h选项,正如你可能首先假定的,你会得到Selenium-RC服务器的选项,而不是Selenium-Grid的。
java -jar selenium-server-standalone-2.21.0.jar -h这将给予你Selenium-RC的服务器选项。如果你想要Selenium-Grid的命令行帮助,你必须首先使用-hub或-node选项,告诉Selenium服务器你对Selenium-Grid感兴趣,然后跟着一个-h。
java -jar selenium-server-standalone-2.21.0.jar -role node -h或者,其实,你也可以只是传递一个垃圾参数给-role node选项,例如。
java -jar selenium-server-standalone-2.21.0.jar -role node xx你会首先看到“INFO...”和一个“ERROR”,但跟着那个,你会得到Selenium-Grid的命令行选项。在此我们没有列出整个输出,因为它太长了,前几行看起来像这个。
Jul 19, 2012 10:10:39 AM org.openqa.grid.selenium.GridLauncher main常见错误
不能存取jarfile
Unable to access jarfile selenium-server-standalone-2.21.0.jar该错误可能发生,当在启动一个集中器或节点的时候。这意思是Java不能找到Selenium服务器的jar文件。要么从selenium-server-XXXX.jar文件所在的目录运行这个命令,或者为这个jar指定显式的路径。
故障排除