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中的代码如下
#encoding:utf- require 'childprocess' test_cases = Dir.glob('**/*spec') caps_flags = ['ie','firefox','chrome'] process_arr = []
test_cases.each do | test_file |
caps_flags.each do | flag |
process = ChildProcess.build("rspec.bat","-f","doc","#{test_file}")
process.environment["flag"] = flag
process.start
process_arr << process
end process_arr.each do |p|
begin
p.poll_for_exit()
rescue ChildProcess::TimeoutError
p.stop
end
end
end
2、在public.rb中的代码如下
#encoding:utf-8
require 'childprocess' $huburl = 'http://localhost:4444/wd/hub' $browser_driver = ENV['flag']
case $browser_driver
when "firefox" then
$caps = Selenium::WebDriver::Remote::Capabilities.firefox
when "chrome" then
$caps = Selenium::WebDriver::Remote::Capabilities.chrome
else
$caps = Selenium::WebDriver::Remote::Capabilities.ie
end
3、login_cnblogs_spec.rb的代码做了一些修改
#encoding:utf-8
require 'selenium-webdriver'
require 'rspec'
require 'yaml' require File.dirname(__FILE__)+'/../../public/public'
require File.dirname(__FILE__)+'/../tool/login_dialog'
require File.dirname(__FILE__)+'/../action/login_page' describe 'cnblogs main login page' do
include Login_Dialog before (:all) do
@data = YAML.load (File.open(File.dirname(__FILE__)+'/../config/login_data.yml'))
end before (:each) do
@dr = Selenium::WebDriver.for(:remote,:url => $huburl,:desired_capabilities => $caps)
@dr.navigate.to @data["data"]["mainpage"]["url"]
@dr.manage.window.maximize()
@driver = Login_Page.new(@dr)
end after (:each) do
@dr.quit
end
context 'input the wrong passwd' do
it 'login failed,and return "用户名或密码错误"' do
@driver.login(@data["data"]["logindata"]["wrong"]["username"],@data["data"]["logindata"]["wrong"]["password"])
expect(@driver.message).to eql (@data["data"]["logindata"]["wrong"]["message"])
end
end
end
4、同时测试数据文件login_data.yml也有了小改动
data:
mainpage:
url: http://passport.cnblogs.com/login.aspx
title: 用户登录 - 博客园用户中心
logindata:
wrong:
username: gqou
password: 123456
message: 用户名或密码错误
OK,现在通过DOS窗口执行一下主文件 ruby main.rb就可以看到运行结果了(记得要启动hub和node服务哦!)。祝你顺利!
由上图可以看出,用例是在并行执行。
本章节涉及到一些技术细节,由于个人能力有限,恐怕误导大家,请见谅!如果深入了解请访问https://github.com/jarib/childprocess
到此为止,Selenium WebDriver + Grid2 + RSpec之旅告一个小段落了。在这里非常感谢我的同组同事庞大师(Genvia)的悉心指导!谢谢大家阅读!
Selenium WebDriver + Grid2 + RSpec之旅(六) ----多浏览器的并行执行的更多相关文章
- Selenium WebDriver + Grid2 + RSpec之旅(四) ----通过RSpec编写测试用例
Selenium WebDriver + Grid2 + RSpec之旅(四) ----通过RSpec编写测试用例 自动化测试和手工测试一样,是要有测试用例,有检查点和测试结果的,接下来我们通过RSp ...
- Selenium WebDriver + Grid2 + RSpec之旅(五)---面向对象设计用例
Selenium WebDriver + Grid2 + RSpec之旅(五) ----面向对象设计用例 前几节讲了怎么一步一步的从零开始到编写出一个简单的测试用例,这一节将要讲一下怎么让测试用例变得 ...
- Selenium WebDriver + Grid2 + RSpec之旅(三) ----入门小例子
Selenium WebDriver + Grid2 + RSpec之旅(三) ----入门小例子 第一个例子都是比较简单的博客园登录界面,就像学习编程语言时候都是从Hello,World!开始. 1 ...
- Selenium WebDriver + Grid2 + RSpec之旅(二)----Grid2的配置
Selenium WebDriver + Grid2 + RSpec之旅(二) ----Grid2的配置 为什么要使用Selenium-Grid 分布式运行大规模的TestCase 能够通过一个中央节 ...
- Selenium WebDriver + Grid2 + RSpec之旅(一)----准备篇
Selenium WebDriver + Grid2 + RSpec之旅(一) ----准备篇 前言 在Web 2.0 应用中,在浏览器种类盛行的时代,我们在测试过程中不仅要模 ...
- Selenium (2) —— Selenium WebDriver + Grid2(101 Tutorial)
Selenium (2) -- Selenium WebDriver + Grid2(101 Tutorial) jvm版本: 1.8.0_65 selenium版本: v2.48.0 (Standa ...
- 基于Java+Selenium的WebUI自动化测试框架(六)---浏览器初始化
本篇我们来讨论,如何写一个浏览器初始化的类.在写之前,先思考一下,我们需要一个什么样的初始化? 先来看看使用原生的Java + selenium是怎么做的.(以firefox为例) System.se ...
- Python Selenium Webdriver常用方法总结
Python Selenium Webdriver常用方法总结 常用方法函数 加载浏览器驱动: webdriver.Firefox() 打开页面:get() 关闭浏览器:quit() 最大化窗口: m ...
- selenium webdriver学习(六)------------如何得到弹出窗口
selenium webdriver学习(六)------------如何得到弹出窗口 在selenium 1.X里面得到弹出窗口是一件比较麻烦的事,特别是新开窗口没有id.name的时候.当时还整理 ...
随机推荐
- 常用数据结构[OpenCV 笔记12]
Point 二维坐标系下的整数点, 定义如下 typedef Point_<int> Point2i; typedef Point2i Point; typedef Point_<f ...
- MYSQL命令cmd操作
今天我们就来看一下数据库的各种命令,以下命令全部是从CMD命令窗口下的命令行输入指令,首先如果如果输入mysql,系统提示“mysql不是内部命 令或外部命令.那么这其实是环境变量没有设置好的原因,例 ...
- 深度优化LNMP之PHP (转)
深度优化LNMP之PHP PHP缓存加速介绍 1.操作码介绍及缓存原理 当客户端请求一个php程序时,服务器的PHP引擎会解析该PHP程序,并将其编译为特定的操作码文件(Operate ...
- docker中搭建jenkins环境
想在docker中搭建一个jenkins环境.开始的时候我想在先pull centos,然后在里面自己搭建环境,搭建后的环境可以运行,但是不知道挂载哪的数据,这也是我不熟悉jenkins的原因. 同事 ...
- apache .htaccess 伪静态重定向,防盗链 限制下载...
301全站跳转 RewriteEngine OnRewriteCond %{HTTP_HOST} ^www\.old\.net$ [NC]RewriteRule ^(.*)$ http://www.n ...
- CSS3 学习
border-radius: 半径,不用学了,用得很熟了,但要记得它的某一个角的写法是border-top/bottom-left/right-radius: ,参数中的两个值为先左右后上下,支持百分 ...
- STM32系列命名规则
转自:STM32系列命名规则 STM32 F 103 C 6 T 7 xxx 1 2 3 4 5 6 7 8 第1部分:产品系列名,固定为STM32 第2部分:产品类型:F表示这是Flash产品,目前 ...
- 国内物联网平台初探(八):移动云OneNET
国内物联网平台初探(八)——移动云OneNET 平台架构 数据模型 使用场景示意图 服务 IOT Paas 基础服务 为IoT开发者提供智能设备自助开发工具.后台技术支持服务,为您提供物联网专网.短彩 ...
- Cocos2d-x 3.0 beta 中加入附加项目,解决无法打开包括文件:“extensions/ExtensionMacros.h”: No such file or directory”
Cocos2d-x 3.0 Alpha 1开始 对目录结构进行了整合.结果有些附加项目也被在项目中被精简出去. 比如说如果你需要使用CocoStdio导出的JSON.或使用Extensions扩展库, ...
- Java多线程初学者指南(5):join方法的使用
在上面的例子中多次使用到了Thread类的join方法.我想大家可能已经猜出来join方法的功能是什么了.对,join方法的功能就是使异步执行的线程变成同步执行.也就是说,当调用线程实例的start方 ...