使用Selenium Grid进行跨浏览器测试—全栈软件测试自动化(9)

发表于:2020-7-07 09:14

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:赵旭斌 余杰    来源:51Testing软件测试网原创

  3.2.6  使用Selenium Grid进行跨浏览器测试
  上一节已经介绍了如果利用远程服务器运行测试脚本,通过自行定义caps可以指定浏览器及版本等属性。但是,该功能仍然不够强大,如不能跨多台机器分布式执行测试或者跨浏览器多线程并发执行等。要实现上述功能,Selenium提供了一个Selenium Grid工具。这个工具的主要作用是方便自动化测试,简单、快速地支持跨浏览器和跨操作系统的组合运行。利用Selenium Grid,可以建立一个简单而强大的架构,可以快速搭建跨浏览器及操作系统的分布式测试环境,同时可以通过多线程并发运行的方式提高测试效率。
  Selenium Grid分为两个部分,分别是Hub和Node。相信读者都知道USB Hub这个概念(不知道的请自行搜索)。在一些计算机子流上,一端是一个总线USB,另一端会有n个子USB接口,用户可以很方便地直接在USB Hub上插拔子USB,唯一的条件是保证总线USB成功连接到计算机即可,路由器上的LAN口也是这个道理。Selenium Grid的Hub就是这样的一个总线接口,它可以支持各种Node的注册。Node可以看作一个已指定浏览器与操作系统等配置的测试子节点,而Hub就是管理这些所有节点的“总管”。
  1.Selenium Grid的安装与配置
  Selenium Grid的安装很容易,利用Standalone Server的jar包,即可启动Selenium Grid的Hub。命令如下。
   java -jar selenium-server-standalone.jar -role hub
  INFO - Launching Selenium Grid hub
  运行以上命令后,如果看到图3.8所示的结果,就说明启动成功。
  图3.8  Selenium Grid的Hub启动成功
  如果最后一行输出Selenium Grid hub is up and running,就说明Hub已经启动成功了。这里需要注意的是倒数第二行的Nodes should register to http://<ip>: 4444/grid/register/,翻译过来的意思就是,可以直接通过这个地址在Hub上注册新节点。
  紧接着,在Node端运行以下命令。
 java -jar selenium-server-standalone-3.4.0.jar -role node -hub http://localhost:4444/grid/register/
  运行以上命令后,如果不出任何问题,会看到图3.9所示的结果。
  图3.9  在Node端运行命令的结果
  本例中Hub和Node是在同一台机器上的,如果需要跨机器绑定Node,只需要将localhost替换成Hub机器的IP(上面提到的http://<ip>:4444/grid/register/地址)即可。
  当Hub成功运行并绑定了相应的Node之后,如果读者尝试打开http://localhost: 4444/grid/console这个地址,会出现图3.10所示的结果。
  图3.10  Grid控制台中的结果
  如图3.10所示,Grid控制台显示所有当前可获得的浏览器支持,这个是默认状态下的配置。我们也可以自定义需要的浏览器,方法非常简单,只需要在注册Node的命令行中加入一个新的参数“-browser”即可。例如,当我们希望一个Node仅支持Safari浏览器时,就可以使用“-browser browserName=safari”。最后的命令如下。
  java -jar selenium-server-standalone-3.4.0.jar -role node -hub 
  http://localhost:4444/grid/register/ -browser browserName=safari
  运行以上命令之后,打开http://localhost:4444/grid/console链接,会看到图3.11所示的结果,在列表里仅仅有一个Safari浏览器图标,表示仅支持Safari浏览器。
  图3.11  Grid控制台只显示Safari浏览器的图标
  当然,也可以添加多个浏览器的支持。同样使用“ browser”这个参数,在注册Node的命令中,只需要以多次重复的方式来添加不同的浏览器支持即可。最后的命令如下。
  java -jar selenium-server-standalone-3.4.0.jar -role node -hub http://localhost:4444/grid/register/ -browser browserName=safari -browser browserName=firefox
  如果再次打开http://localhost:4444/grid/console链接,Grid控制台多了一个Firefox浏览器的图标,如图3.12所示。
  图3.12  Grid控制台显示Safari和Firefox浏览器的图标
  2.测试脚本运行
  当所有配置完成之后,就可以尝试在Grid服务器上执行测试脚本了。首先,导入unittest单元测试框架,并从Selenium导入WebDriver。然后,声明setUp及tearDown。实现代码如下。
   import unittest
  from selenium import webdriver
  class Grid(unittest.TestCase):
      def setUp(self):
          url = 'http://localhost:4444/wd/hub' 
          desired_caps = {}
          desired_caps['browserName'] = 'firefox' 
          self.driver = webdriver.Remote(url, desired_caps)

      def tearDown(self): 
          self.driver.quit()

      def test_page_loaded(self):
          driver = self.driver 
          driver.get(' Mercury Tours登录页面') 
          assert driver.title == 'Welcome: Mercury Tours'

  if __name__ == "__main__": 
      unittest.main()
  此处setUp方法同样使用远程方式连接到Grid服务器,并通过desired_caps['browserName'] = 'firefox'告诉Grid需要调用Firefox浏览器并执行测试脚本。Selenium Grid一旦接收了指令,就会找对应的Node并对其进行调用。
  对于Selenium Grid来说,它可以注册多个Node。脚本调用层只需要定义Hub的地址和端口即可,完全不用关心每一个Node的IP地址和端口是多少。这里唯一要做的就是把包含正确key的desire_caps对象传递给Remote对象即可。这样做的好处很明显,Hub端可以随意添加新的Node且不影响脚本层,而脚本层也只需要设置或者以配置文件的方式增加新的desired_caps即可。即使不知道被添加Node的任何连接信息,也能很容易地对其进行集成。
  3.2.7  Sauce Labs—想你所想,无所不能
  Sauce Labs是一家于2008年8月创立的、专门提供云端自动化测试虚拟平台的公司,创始人分别为Steven Hazel、John Dunham及Selenium的缔造者Jason Huggins。
  Sauce Labs直至今日仍然是行业中的佼佼者,用户可以轻易地在Sauce Labs云端模拟出一个Mac操作系统上的Safari 10.0版本浏览器,并在云端运行测试脚本。Sauce Labs是一种基于操作系统平台、浏览器平台及移动设备平台任意组合的先进虚拟环境构建系统。下面介绍Sauce Labs的功能。
  1.准备工作
  Sauce Labs虽然不是一个免费的平台,但支持用户注册开源账号。如图3.13所示,用户最多可以使用5个并发虚拟机及两个子账户。自动化测试和手工测试可无限制使用,虽然限制不少,但一个免费账号对于我们学习如何使用Sauce Labs来说已经绰绰有余。
  注册完成后,直接登录就可以看到左边栏的 Dashboard、Manual tests、Tunnels 及Analytics等菜单(见图3.14),这样准备工作就完成了,接下来可以开始体验Sauce Labs了。
            
               图3.13  Sauce Labs开源账号所提供的权限 
            
图3.14  登录Sauce Labs后的菜单
  2.利用Sauce Labs进行手动测试
  如图3.14所示,当单击Manual tests之后,Sauce Labs会自动打开New Session对话框。这个对话框的信息量并不大,用户可自由地选择被测的URL、对应的被测平台、浏览器版本的组合,以及分辨率(见图 3.15)。整个操作过程非常简单,用户只要一看到界面就知道如何操作。
  图3.15  创建手动测试的配置组合
  如图3.15所示,直接输入想要测试的URL,单击Start session按钮(记得选中SAVE SCREENSHOTS,LOGS & VIDEO选项,这样才能保存截图日志及回放视频)。然后等待片刻,一个全新的Windows 10环境下的Firefox 55就自动生成。
  此外,Sauce Labs还会为用户自动跳转到对应的URL 并设置对应的分辨率,接着就可以开始手动测试了。测试完毕后,在界面右上方单击“结束”按钮可以直接结束整个Session。
  在完成测试之后,往往我们需要相应的视频和日志以供后续查看。关于这一点,Sauce Labs也考虑到了。返回主界面后,单击左边的Dashboard,在右边选择Manual Tests标签页即可看到刚才测试的Session记录,如图3.16所示。
  如图3.16所示,找到之前手动测试的那个Session,单击它,即可查看之前的视频和日志。
  图3.16  支持回看Session记录


  对于Mac用户,如果看不到视频,则需要为正在使用的浏览器加载正确的Flash浏览器插件,因为视频格式是FLV。另外,对于每一个测试操作,Sauce Labs还会提供一个截图,在结果页面中切换到Metadata标签页,即可直接下载对应的截图和回放视频,如图3.17所示。
  图3.17  用户可以自由下载运行时截图和视频

  看了以上实例后,一部分读者可能会有一个疑问。试想公司现有一项目已经到了准备测试阶段,项目发布之前肯定要把项目放在测试环境上进行测试,而大多数公司的测试环境只允许公司内部人员访问,但Sauce Labs创建的每一个虚拟环境都是通过公网访问的,它并不能访问公司内部的网络环境,这就直接导致我们无法使用这套环境进行测试。
  为了解决此疑问,Sauce Labs提供了一项功能—Sauce Connect Proxy。下面一起看一下这项功能的具体使用方式。
  在使用Sauce Connect Proxy之前,先了解什么是Sauce Connect Proxy。
  如图3.18所示,在创建Session界面的左下角单击SAUCE CONNECT PROXY旁边的问号“?”按钮,会得到Sauce Labs对它的解释“Sauce Connect Proxy allows you test on localhost or behind the firewall.”。对这个英文句子的简单解释就是,Sauce Connect Proxy允许用户在本地的主机上进行测试。那么现在我们可以明确的是,它可以让Sauce Labs的虚拟机成功连接到被测环境中的网络并进行测试。
  图3.18  Sauce Connect Proxy
  Sauce Connect Proxy究竟是如何工作的呢?下面来看具体的实现步骤。
  (1)到Sauce Labs官方网站下载新的Sauce Connect Proxy工具包,如图3.19所示。
  图3.19  Sauce Connect Proxy工具包下载界面
  官方提供了OS X、Windows及Linux版本的安装工具包,用户可自行下载对应的版本。下载完成后先解压下载的文件,会得到图3.20所示的文件。
  (2)使用命令行工具进入这个目录,直接运行一条命令行,即可启动Sauce Connect Proxy服务,具体命令如下。
  对于Mac用户,可使用以下命令。
  bin/sc -u YOUR_USERNAME -k YOUR_ACCESS_KEY
  对于Windows用户,可使用以下命令。
 bin\sc -u YOUR_USERNAME -k YOUR_ACCESS_KEY
  第一个参数-u是在Sauce Labs上注册的用户名,直接替换YOUR_USERNAME即可。第二个参数-k是对应用户名在Sauce Labs上的一个Key ID。在登录Sauce Labs后,单击右上角的用户名下拉列表,然后选择User Settings选项(见图3.21)。接着用户会看到User Information(用户信息)、Email Settings(邮箱设置)及我们需要的Access Key(密钥),如图3.22所示。
              
                     图3.20  工具包解压后的文件              
图3.21  选择User Settings选项
  图3.22  Access Key
  如图3.22所示,Sauce Labs在用户注册后就创建好了一个Access Key。这里需要注意两点。这两点很重要,希望读者谨记。
  第一,这个密钥不要随意与他人分享,否则别人可以随意使用你的账号。后续在Sauce Labs上进行自动化测试也会使用这个密钥,因此这个密钥非常重要,希望各位保管好自己的密钥。
  第二,读者一定看到了那个红色按钮(真实界面上可看到),上面写着Regenerate Access Key,意思是重新生成密钥,那这个按钮为什么是红色呢?Warning: Regenerating your access key will require update your access key value throughout your configuration. Commands containing your old access key will fail.”这句话就是告诉用户,如果单击了这个按钮,那么旧的密钥就会完全失效从而无法继续使用,因此这里必须谨慎。一般情况下,只有密钥泄露了才会使用这个选项。
  默认状态下,密钥是不可见的。要查看密钥,单击Show按钮,并输入登录密码即可。在获取密钥以后,即可直接运行刚才的命令行,如图3.23所示。
  图3.23  运行命令,准备开始测试
  启动后看到Sauce Connect is up, you may start your tests这一行日志,就说明Sauce Connect Proxy已经成功启动了。那么如何在Sauce Labs端验证已经可以成功连接到启动的Sauce Connect Proxy服务了呢?其实非常简单,只需要在登录Sauce Labs后,在左侧栏中选择Tunnels,就会发现刚才启动的Sauce Connect Proxy已经显示在页面中,如图3.24所示。
  当前有一个被激活的Sauce Connect Proxy可用,不过因为此处没有为刚才创建的Tunnel命名(注意,一旦启动了一个Sauce Connect Proxy,Sauce Labs就会检测到之前启动的Sauce Connect Proxy,而在Sauce Labs端它们统一称为Tunnel,每一个Tunnel连接到一个已启动Sauce Connect Proxy的环境),所以网页中直接显示了Unnamed tunnel。如果需要加入名称,只需要增加一个参数即可。命令如下。
 bin/sc -u YOUR_USERNAME -k YOUR_ACCESS_KEY -i selenium

  图3.24  启动的Tunnel 
  运行以上命令后,即可看到Tunnel的名称了。这样做的好处是,如果需要安装多个Sauce Connect Proxy,则用户可以很容易地区分Tunnel到底连接到哪一个环境中了。
  如图3.25所示,一旦加上-i参数后,即可显示相应的名称,用户就可以非常容易地识别自己创建的Tunnel了。此时如果再次尝试创建一个新的手动测试的Session界面,用户就可以自由选择对应的已经创建好的Tunnel,如图3.26所示。
  图3.25  Tunnel的名称
  图3.26  选择Tunnel
  一旦选择了对应的Tunnel之后,用户在单击Start session按钮后,就可以直接访问对应Tunnel的环境了。
  3.利用Sauce Labs进行自动化测试
  之前讲了Sauce Labs的基本知识及手动测试的方式,相信读者已经对Sauce Labs有一个大体的了解,知道如何从Sauce Labs创建一个自定义的虚拟环境并进行测试。下一步自然是在用Sauce Labs创建的环境当中运行自动化测试脚本,不过其操作流程与之前手动测试的方式有区别。下面进行详细讲解。
  读者应该还记得,前面讨论了通过登录Sauce Labs并单击左侧的Manual tests,接着选取需要定义的环境即可进行测试。而如果我们需要进行自动化测试,这样的步骤就显得太过烦琐。另外,如果每一次运行自动化测试脚本之前都需要手工完成这些步骤就太麻烦了,并且这种方式无法应用在持续集成测试中,因此Sauce Labs提供了一种方式,可以让用户使用脚本的方式自动建立Session虚拟环境。具体请看如下代码实例。
   import unittest
  from selenium import webdriver
  class SaucelabsExample(unittest.TestCase):
      def setUp(self):
          caps = {'browserName': "chrome"}
          caps['platform'] = "macOS 10.12"
          caps['version'] = "51.0"
          self.driver = webdriver.Remote(
              command_executor='http://SAUCE_USERNAME:SAUCE_ACESS_KEY@ondemand.saucelabs.
               com:80/wd/hub',
              desired_capabilities=caps
          )

      def tearDown(self): 
          self.driver.quit()

      def test_page_loaded(self):
          driver = self.driver 
          driver.get(' Mercury Tours登录页面') 
          assert driver.title == 'Welcome: Mercury Tours'

  if __name__ == "__main__": 
      unittest.main()
  在运行这段脚本之前,我们首先分析一下此脚本具体做了什么。读者可以看到脚本里首先定义了一个caps对象,这个caps对象定义了browserName(浏览器名称)、platform(具体的操作系统)和version(具体的版本号)。
  为什么platform后面跟着“macOS 10.12”?用户怎么知道测试的什么平台呢?其实Sauce Labs已经为我们准备好了platform的配置,我们需要做的就是进入Sauce Labs网站的“/display/DOCS/Platform+Configurator#/”页面,然后根据需要自行选择对应的浏览器、操作系统及版本号,如图3.27所示。
  图3.27  选择平台的配置
  根据需求选择所有选项,并在界面底部的COPY CODE栏处选择对应的语言后,Sauce Labs就会自动生成好对应语言的部分代码。此处使用的是Python语言,因此可以选择python,如图3.28所示。
  图3.28  自动生成的部分Python代码
  如图3.28所示,我们得到了之前所有的配置信息的代码,而且可以保证其正确性,因为代码是由Sauce Labs官方生成的。
  接下来的事情就比较简单了,读者只需要尝试复制以上完整脚本,并将SAUCE_ USERNAME与SAUCE_ACCESS_KEY替换成自己之前注册的用户名和ACCESS_KEY(之前已经讲解过如何获取这个密钥,此处不再重复讲解)。替换完成后,保存文件为saucelabs_demo.py。最后运行以下命令行。
  python saucelabs_demo.py
  运行以上命令后并等待一段时间,得到的结果如图3.29所示。
  图3.29  Python文件成功运行的结果
  一共包含1个test,运行了约15s。下面我们在Sauce Labs页面中检查一下刚才的运行结果。首先登录Sauce Labs并打开Dashboard,然后选择Automated Tests标签页,接着会看到图3.30所示的结果。
  图3.30  自动化测试结果
  如图3.30所示,此处会自动生成一条新的记录,可以看到右边显示的系统版本号和浏览器的版本与脚本中定义的完全对应。单击SHOWING按钮,打开页面后会看到图3.31所示的界面。
  如图3.31所示,用户可以看到每一个操作步骤对应的截图,并且Sauce Labs加入了回放的功能。只需要单击Play按钮,刚才执行的测试就会自动回放,且在回放过程中实时对应到Selenum每一次操作的Command。
  图3.31  自动化测试结果的具体信息
  这里强烈推荐读者使用Commands这个标签页进行回放,因为Watch标签页下有两个缺点:第一个缺点是Watch页面必须要安装Flash才可以观看视频,第二个缺点是一旦出现了问题,无法快速地定位到具体问题出现在哪一步。
  之前在Sauce Labs的Automated Tests标签页截图中显示的是Unnamed job,其实严格来说,如果没有为测试项目定义一个合理的名称,日后查看日志时容易弄混,找不到对应的测试。
  那么如何为测试项目定义一个名称呢?答案很简单,只需要在定义caps对象时,定义一个name属性即可。测试脚本如下。
   import unittest
  from selenium import webdriver
  class SaucelabsExample(unittest.TestCase):
      def setUp(self):
          caps = {'browserName': "chrome"}
          caps['platform'] = "macOS 10.12"
          caps['version'] = "51.0"
          caps['name'] = "selenium_demo"
          self.driver = webdriver.Remote(
              command_executor='http://SAUCE_USERNAME:SAUCE_ACESS_KEY@ondemand.saucelabs.
              com:80/wd/hub',desired_capabilities=caps
          )

      def tearDown(self): 
          self.driver.quit()

      def test_page_loaded(self):
          driver = self.driver 
          driver.get(' Mercury Tours登录页面') 
          assert driver.title == 'Welcome: Mercury Tours'

  if __name__ == "__main__": 
      unittest.main()
    在运行以上代码后,就可以看到Sauce Labs中出现了selenium_demo这个名字,如图3.32所示。
  图3.32  定义并显示自动化测试项目的名称
  这样,当运行多个测试脚本的时候,通过名称可以方便地辨别每一个Session对应的测试用例
  在图3.31所示的界面中,另外两个标签页Logs和Metadata又有什么作用呢?
  Logs其实是一个相当重要的功能,当用户选择selenium-server.log选项后,即可查看测试脚本运行时Selenium服务器的整个日志,如图3.33所示。
  图3.33  查看日志
  在选择Logs之后,即可看到当前测试的一些具体的日志,如图3.34所示。包括客户端的请求及服务器端的响应都一目了然。当测试出现错误的时候或者需要定位测试脚本到底哪里出现问题时,这个功能是非常有帮助的,同时它还提供了日志下载功能。
  Metadata标签页包含了Session的所有配置信息。通过Metadata可以查看运行时间等参数,或者下载截图及视频等,总体来说较常用的还是Commands和Logs。
  图3.34  具体日志信息

查看《全栈软件测试自动化 Selenium和Appium (Python版)》全部连载章节
版权声明:51Testing软件测试网获得人民邮电出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号