Selenium (2) —— Selenium WebDriver + Grid2(101 Tutorial)
Selenium (2) —— Selenium WebDriver + Grid2(101 Tutorial)
jvm版本: 1.8.0_65
selenium版本: v2.48.0 (Standalone Selenium Server)
参考来源:
Use Selenium Grid to enhance testing of web applications
Selenium WebDriver + Grid2 + RSpec之旅
Selenium (1) —— Selenium安装与测试(101 Tutorial)
准备
依照Selenium (1) —— Selenium安装与测试(101 Tutorial)搭建Selenium Grid环境,并且启动hub与浏览器代理
代码
一个简单的脚本(示例一)
我们以cnblogs登陆行为举例

在工作目录下新建文件login_cnblogs.rb,并添加以下代码
#encoding:utf-8
require 'selenium-webdriver'
# 向hub请求一个firefox的webdriver
dr = Selenium::WebDriver.for(:remote,:url => 'http://localhost:4444/wd/hub', :desired_capabilities => :firefox)
#将浏览器导航至cnblogs网站的登陆页
dr.navigate.to 'http://passport.cnblogs.com/user/signin'
#输入用户名
dr.find_element(:id,'input1').send_keys('weizhe_2008')
#输入密码
dr.find_element(:id,'input2').send_keys(‘********’)
#点击登录
dr.find_element(:id,'signin').click
sleep 10
#关闭浏览器
dr.close
保存后在当前目录下,运行
$ ruby login_cnblogs.rb
查看firefox webdriver输出

查看selenium hub输出

如果一切正常,hub会自动运行一个firefox代理,然后执行我们以上的脚本并自动登陆cnblogs
以上我们只是完成了一个简单的自动化登陆的脚本,还不是一个完整的测试,下面我们引入rspec来将这个测试补充完整。
一个rspec测试脚本(示例二)
首先gem安装rspec
$ sudo gem install rspec
执行结果:
Successfully installed rspec-3.4.0
Parsing documentation for rspec-3.4.0
1 gem installed
新建文件login_cnblogs_spec.rb
#encoding:utf-8
# $ sudo gem install rspec
require 'selenium-webdriver'
require 'logger' RSpec.describe 'cnblogs main login page' do
context 'input the wrong passwd' do
it 'login failed,and return "用户名或密码错误"' do
dr = Selenium::WebDriver.for(:remote,:url => 'http://localhost:4444/wd/hub',:desired_capabilities => :firefox) dr.navigate.to 'http://passport.cnblogs.com/user/signin'
#输入用户名
dr.find_element(:id,'input1').send_keys('weizhe_2008')
#输入密码
dr.find_element(:id,'input2').send_keys('********')
#点击登录
dr.find_element(:id,'signin').click sleep 10 #result = dr.find_element(:id,'tip_btn').text
result = dr.find_element(:id,'tip_btn').attribute("innerHTML")
logger = Logger.new(STDOUT)
logger.info(result)
#rspec eq会自动为换行符加上\
expect = '用户名或密码错误<br><br>联系 contact@cnblogs.com'
expect(result).to eq(expect)
#关闭浏览器
dr.close
end
end
end
以上测试为一个登陆错误行为提供验证,如果登陆错误,页面上会提示“用户名或密码错误
联系 contact@cnblogs.com”字样,我们需要做的就是获取这段提示信息元素的内容,并查看期望的信息是否与之相同
命令行运行
$ rspec login_cnblogs_spec.rb --format doc
返回信息
cnblogs main login page
input the wrong passwd
I, [2016-01-04T10:00:07.578980 #12150] INFO -- : 用户名或密码错误<br><br>联系 contact@cnblogs.com
login failed,and return "用户名或密码错误" Finished in 12.21 seconds (files took 0.1758 seconds to load)
1 example, 0 failures
查看firefox代理下的输出

重构(示例三)
以上只是一个简单的测试,所有的信息都杂糅在一个文件中,要让测试用例变得健壮,易阅读,易维护。那就是通过面向对象的方式,再加上逻辑和数据分离的方式来处理,这个才是自动化测试的核心思想。
设计思路
设想对登录进行手工测试,会想到一些测试用例(验证错误的用户名正确的密码;用户名和密码为空直接点击登陆按钮。等等),如果每个用例都要写一套代码的话,会发现有些地方出现代码重复,不利于测试代码的维护。进一步研究发现, 有些测试对象也是可以复用的,比如在登陆的时候我们会用到密码输入框、点击登录按钮等,可以把这些“基本动作”封装到一个类中,这样代码的灵活性和适用性 将会更强。即,面向对象编程。
因此对测试目录结构做了一些调整:
新建一个文件夹tool,用来定义一些获取控件的方法
新建一个文件夹action,用来定义一下页面操作的方法
新建一个文件夹spec,用来存放测试用例
新建一个文件夹config,用来存放测试用例所涉及到的测试数据

对于测试数据的管理,采用yaml来管理
在我们的工作目录下创建文件夹Login_Page (表示这个是一个登录页面的测试)
在Login_Page下分别创建文件夹tool,action,spec,config
action文件夹中新建文件login_page.rb
config文件夹中新建文件login_data.yml
spec文件夹中新建文件login_cnblogs_spec.rb
tool文件夹中新建文件login_dialog.rb
../login/action/login_page.rb
#encoding:utf-8
require 'selenium-webdriver'
require File.dirname(__FILE__)+'/../tool/login_dialog'
class Login_Page
include Login_Dialog
def initialize(dr)
@dr ||= dr
end
def login(username,passwd)
get_username.send_keys(username)
get_passwd.send_keys(passwd)
get_submit.click
end
def message
get_message.attribute("innerHTML")
end
end
../login/config/login_data.yml
data:
mainpage:
huburl: http://localhost:4444/wd/hub
url: http://passport.cnblogs.com/login.aspx
title: 用户登录 - 博客园用户中心
logindata:
wrong:
username: weizhe_2008
password: 12345678
message: '用户名或密码错误<br><br>联系 contact@cnblogs.com'
../login/spec/login_cnblogs_spec.rb
#encoding:utf-8
require 'selenium-webdriver'
require 'rspec'
require 'yaml'
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 => @data["huburl"],:desired_capabilities => :firefox)
@dr.navigate.to @data["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["username"], @data["password"])
sleep 10 expect(@driver.message).to eql (@data["message"])
end
end
end
../login/tool/login_dialog.rb
#encoding:utf-8 require 'selenium-webdriver'
module Login_Dialog
def get_username
@dr.find_element(:id,'input1')
end
def get_passwd
@dr.find_element(:id,'input2')
end
def get_submit
@dr.find_element(:id,'signin')
end
def get_message
@dr.find_element(:id,'tip_btn')
end
end
在../login/spec下运行
:ruby Richard$ cd login
:login Richard$ ls
action config spec tool
:login Richard$ cd spec/
:spec Richard$ ls
login_cnblogs_spec.rb
:spec Richard$ rspec login_cnblogs_spec.rb --format doc
可以得到示例二中相同的结果

结束
Selenium (2) —— Selenium WebDriver + Grid2(101 Tutorial)的更多相关文章
- Selenium (3) —— Selenium IDE + Firefox录制登录脚本(101 Tutorial)
Selenium (3) -- Selenium IDE + Firefox录制登录脚本(101 Tutorial) selenium IDE版本: 2.9.1 firefox版本: 39.0.3 参 ...
- Selenium (4) —— Selenium是什么? WebDriver是什么?做什么?(101 Tutorial)
Selenium (4) -- Selenium是什么? WebDriver是什么?做什么?(101 Tutorial) selenium版本: v2.48.0 (Standalone Seleniu ...
- Selenium (1) —— Selenium安装与测试(101 Tutorial)
Selenium (1) -- Selenium安装与测试(101 Tutorial) jvm版本: 1.8.0_65 selenium版本: v2.48.0 (Standalone Selenium ...
- JMeter (2) —— JMeter与WebDriver测试用户登陆以CAS SSO为例(101 Tutorial)
JMeter (2) -- JMeter与WebDriver测试用户登陆以CAS SSO为例(101 Tutorial) 主要内容 JMeter与WebDriver测试用户登陆以CAS SSO为例 环 ...
- JMeter (1) —— JMeter与WebDriver安装与测试(101 Tutorial)
JMeter (1) -- JMeter与WebDriver安装与测试(101 Tutorial) 主要内容 JMeter安装 WebDriver安装 一个简单的JMeter+WebDriver示例 ...
- JMeter (3) —— JMeter录制脚本并压力测试用户登陆场景以CAS SSO为例(101 Tutorial)
JMeter (3) -- JMeter录制脚本并压力测试用户登陆场景以CAS SSO为例(101 Tutorial) 主要内容 JMeter录制脚本并进行压力测试用户登陆场景,并以CAS SSO单点 ...
- Sahi (1) —— 快速入门(101 Tutorial)
Sahi (1) -- 快速入门(101 Tutorial) jvm版本: 1.8.0_65 sahi版本: Sahi Pro 6.1.0 参考来源: Sahi官网 Sahi Quick Tutori ...
- Sahi (3) —— 压力测试Load Test以CAS SSO登陆场景为例(103 Tutorial)
Sahi (3) -- 压力测试Load Test以CAS SSO登陆场景为例(103 Tutorial) jvm版本: 1.8.0_65 sahi版本: Sahi Pro 6.1.0 参考来源: S ...
- Sahi (2) —— https/SSL配置(102 Tutorial)
Sahi (2) -- https/SSL配置(102 Tutorial) jvm版本: 1.8.0_65 sahi版本: Sahi Pro 6.1.0 参考来源: Sahi官网 Sahi Quick ...
随机推荐
- apache提示没有设置 max-age or expires解决办法
大家看到这个就应该知道只要设置 max-age or expires就行了.下面说的方法是在设置 apache下的方法: 产生要开启 代码如下 复制代码 LoadModule headers_modu ...
- CentOS7安装Tomcat
一.二进制包安装Tomcat 1.下载解压二进制包 wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.32/bi ...
- 项目记录25--unity-tolua框架 View02---BasePanel.lua
还在,还在. ... . 每天晚上找点时间写点点,多了也不想学到底是什么心理啊. 写完看电影去. 今天写两个算超完毕了BaseUI.lua,UIManager.lua(完好中这个) local Bas ...
- 在linux中配置环境变量
JDK下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 根据Linux ...
- php分享二十八:mysql运行中的问题排查
一:杀掉mysql连接的方法: kill thread_id: 杀掉当前进程,断开连接 kill query thread_id: 只杀掉某连接当前的SQL,而不断开连接. 批量杀死MySQL连接的 ...
- php分享二十三:字符编码
1:ASCII 在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a.b.c.d这样的52个字母(包括大写).以及0.1等数字还有一些常用的 ...
- Atitit 项目界面h5化静态html化计划---vue.js 把ajax获取到的数据 绑定到表格控件 v2 r33.docx
Atitit 项目界面h5化静态html化计划---vue.js 把ajax获取到的数据 绑定到表格控件 v2 r33.docx 1. 场景:应用在项目列表查询场景下1 1.1. 预计初步掌握vue ...
- Xilinx官网查询各个版本软件的手册
在Xilinx官网查询各个版本软件的手册需要点击 See All Versions
- 【Unity】6.3 通过 C# 脚本创建和访问游戏对象
分类:Unity.C#.VS2015 创建日期:2016-04-16 一.简介 在游戏开发过程中,脚本不但需要访问脚本所在的游戏对象的组件,还经常需要访问和控制真他游戏对象.另外,根据项目需求,还可能 ...
- Vue2 原理解析
现代主流框架均使用一种数据=>视图的方式,隐藏了繁琐的dom操作,采用了声明式编程(Declarative Programming)替代了过去的类jquery的命令式编程(Imperative ...