zoukankan      html  css  js  c++  java
  • Selenium WebDriver + Grid2 + RSpec之旅(六) ----多浏览器的并行执行

    Selenium WebDriver + Grid2 + RSpec之旅(六)

                                                 ----多浏览器的并行执行

    由于浏览器的发展,浏览器种类繁多。为了保证系统能在各种浏览器上叱咤风云,减少测试人员的测试工作量,就要保证测试脚本支持多浏览器,但是一条测试用例逐个对浏览器进行执行的话又会消耗太多的时间,下面就介绍一下多浏览器并行执行的方法。

    再回头看一下前面介绍过的测试用例脚本,会发现测试用例中的浏览器是指定的firefox,如果要测试IE,CHROME浏览器,去修改测试用例脚本?还是把脚本复制几份?方法都不是太好。我们可以将浏览器名称用一个变量来表示,通过循环来执行用例,每次循环,采用不同的浏览器就OK了,那么还有一个问题就是,这样循环的话还是串行执行,同样会消耗很多的时间,怎么解决呢? 我们通过创建多个进程来执行的话就可以实现浏览器的并行执行,并且只需要一份测试脚本,而且测试脚本中的变量不会在多个进程中出现冲突。OK,下面就让我们开始吧。还是上节讲的用例作为例子(只是做了一些修改)。

    1、在工作目录下创建一个main.rb,和Login_Page同级目录,用来作为启动用例的主文件

    2、在工作目录下创建一个public目录,和Login_Page同级目录,在public中创建文件public.rb,用来存放执行用例的公共数据(之前提到的yaml文件,用来存放测试用例的数据)

    测试代码设计

    其他文件保持不变,一下文件作了修改

    1、在main.rb中的代码如下

     1 #encoding:utf-8
     2 
     3 require 'childprocess'
     4 
     5 test_cases = Dir.glob('**/*spec')
     6 
     7 caps_flags = ['ie','firefox','chrome']
     8 
     9 process_arr = []
    10 test_cases.each do | test_file |
    11   caps_flags.each do | flag |
    12     process = ChildProcess.build("rspec.bat","-f","doc","#{test_file}")
    13     process.environment["flag"] = flag
    14     process.start
    15     process_arr << process
    16   end
    17 
    18   process_arr.each do |p|
    19     begin
    20       p.poll_for_exit(6000)
    21     rescue ChildProcess::TimeoutError
    22       p.stop
    23     end
    24   end
    25 end

    2、在public.rb中的代码如下

     1 #encoding:utf-8
     2 require 'childprocess'
     3 
     4 $huburl = 'http://localhost:4444/wd/hub'
     5 
     6 $browser_driver = ENV['flag']
     7 case $browser_driver
     8   when "firefox" then
     9     $caps = Selenium::WebDriver::Remote::Capabilities.firefox
    10   when "chrome" then
    11     $caps = Selenium::WebDriver::Remote::Capabilities.chrome
    12   else
    13     $caps = Selenium::WebDriver::Remote::Capabilities.ie
    14 end

    3、login_cnblogs_spec.rb的代码做了一些修改

     1 #encoding:utf-8
     2 require 'selenium-webdriver'
     3 require 'rspec'
     4 require 'yaml'
     5 
     6 require File.dirname(__FILE__)+'/../../public/public'
     7 require File.dirname(__FILE__)+'/../tool/login_dialog'
     8 require File.dirname(__FILE__)+'/../action/login_page'
     9 
    10 describe 'cnblogs main login page' do
    11     include Login_Dialog
    12     
    13     before (:all) do
    14         @data = YAML.load (File.open(File.dirname(__FILE__)+'/../config/login_data.yml'))
    15     end
    16     
    17     before (:each) do
    18         @dr = Selenium::WebDriver.for(:remote,:url => $huburl,:desired_capabilities => $caps)
    19         @dr.navigate.to @data["data"]["mainpage"]["url"]
    20         @dr.manage.window.maximize()
    21         @driver = Login_Page.new(@dr)
    22     end
    23     
    24     after (:each) do
    25         @dr.quit
    26     end
    27     context 'input the wrong passwd' do
    28         it 'login failed,and return "用户名或密码错误"' do
    29             @driver.login(@data["data"]["logindata"]["wrong"]["username"],@data["data"]["logindata"]["wrong"]["password"])
    30             expect(@driver.message).to eql (@data["data"]["logindata"]["wrong"]["message"])
    31         end
    32     end
    33 end

    4、同时测试数据文件login_data.yml也有了小改动

    1 data:
    2     mainpage:
    3         url: http://passport.cnblogs.com/login.aspx
    4         title: 用户登录 - 博客园用户中心
    5     logindata:
    6         wrong:
    7             username: gqou
    8             password: 123456
    9             message: 用户名或密码错误

    OK,现在通过DOS窗口执行一下主文件 ruby main.rb就可以看到运行结果了(记得要启动hub和node服务哦!)。祝你顺利!

    由上图可以看出,用例是在并行执行。

    本章节涉及到一些技术细节,由于个人能力有限,恐怕误导大家,请见谅!如果深入了解请访问https://github.com/jarib/childprocess

    到此为止,Selenium WebDriver + Grid2 + RSpec之旅告一个小段落了。在这里非常感谢我的同组同事庞大师(Genvia)的悉心指导!谢谢大家阅读!

  • 相关阅读:
    547. Friend Circles
    399. Evaluate Division
    684. Redundant Connection
    327. Count of Range Sum
    LeetCode 130 被围绕的区域
    LeetCode 696 计数二进制子串
    LeetCode 116 填充每个节点的下一个右侧节点
    LeetCode 101 对称二叉树
    LeetCode 111 二叉树最小深度
    LeetCode 59 螺旋矩阵II
  • 原文地址:https://www.cnblogs.com/ouguangqian/p/Grid_6.html
Copyright © 2011-2022 走看看