Selenium (2) —— Selenium WebDriver + Grid2(101 Tutorial)


jvm版本: 1.8.0_65

selenium版本: v2.48.0 (Standalone Selenium Server)

参考来源:

Selenium官方下载

Use Selenium Grid to enhance testing of web applications

Homebrew

Selenium WebDriver + Grid2 + RSpec之旅

rspec.info

Selenium (1) —— Selenium安装与测试(101 Tutorial)

准备

依照Selenium (1) —— Selenium安装与测试(101 Tutorial)搭建Selenium Grid环境,并且启动hub与浏览器代理

代码

  • 一个简单的脚本(示例一)

    我们以cnblogs登陆行为举例

    在工作目录下新建文件login_cnblogs.rb,并添加以下代码

    1. #encoding:utf-8
    2. require 'selenium-webdriver'
    3. # 向hub请求一个firefox的webdriver
    4. dr = Selenium::WebDriver.for(:remote,:url => 'http://localhost:4444/wd/hub', :desired_capabilities => :firefox)
    5. #将浏览器导航至cnblogs网站的登陆页
    6. dr.navigate.to 'http://passport.cnblogs.com/user/signin'
    7. #输入用户名
    8. dr.find_element(:id,'input1').send_keys('weizhe_2008')
    9. #输入密码
    10. dr.find_element(:id,'input2').send_keys(‘********’)
    11. #点击登录
    12. dr.find_element(:id,'signin').click
    13. sleep 10
    14. #关闭浏览器
    15. dr.close

    保存后在当前目录下,运行

    1. $ ruby login_cnblogs.rb

    查看firefox webdriver输出

    查看selenium hub输出

    如果一切正常,hub会自动运行一个firefox代理,然后执行我们以上的脚本并自动登陆cnblogs

    以上我们只是完成了一个简单的自动化登陆的脚本,还不是一个完整的测试,下面我们引入rspec来将这个测试补充完整。

  • 一个rspec测试脚本(示例二)

    首先gem安装rspec

    1. $ sudo gem install rspec

    执行结果:

    1. Successfully installed rspec-3.4.0
    2. Parsing documentation for rspec-3.4.0
    3. 1 gem installed

    新建文件login_cnblogs_spec.rb

    1. #encoding:utf-8
    2. # $ sudo gem install rspec
    3. require 'selenium-webdriver'
    4. require 'logger'
    5. RSpec.describe 'cnblogs main login page' do
    6. context 'input the wrong passwd' do
    7. it 'login failed,and return "用户名或密码错误"' do
    8. dr = Selenium::WebDriver.for(:remote,:url => 'http://localhost:4444/wd/hub',:desired_capabilities => :firefox)
    9. dr.navigate.to 'http://passport.cnblogs.com/user/signin'
    10. #输入用户名
    11. dr.find_element(:id,'input1').send_keys('weizhe_2008')
    12. #输入密码
    13. dr.find_element(:id,'input2').send_keys('********')
    14. #点击登录
    15. dr.find_element(:id,'signin').click
    16. sleep 10
    17. #result = dr.find_element(:id,'tip_btn').text
    18. result = dr.find_element(:id,'tip_btn').attribute("innerHTML")
    19. logger = Logger.new(STDOUT)
    20. logger.info(result)
    21. #rspec eq会自动为换行符加上\
    22. expect = '用户名或密码错误<br><br>联系 contact@cnblogs.com'
    23. expect(result).to eq(expect)
    24. #关闭浏览器
    25. dr.close
    26. end
    27. end
    28. end

    以上测试为一个登陆错误行为提供验证,如果登陆错误,页面上会提示“用户名或密码错误

    联系 contact@cnblogs.com”字样,我们需要做的就是获取这段提示信息元素的内容,并查看期望的信息是否与之相同

    命令行运行

    1. $ rspec login_cnblogs_spec.rb --format doc

    返回信息

    1. cnblogs main login page
    2. input the wrong passwd
    3. I, [2016-01-04T10:00:07.578980 #12150] INFO -- : 用户名或密码错误<br><br>联系 contact@cnblogs.com
    4. login failed,and return "用户名或密码错误"
    5. Finished in 12.21 seconds (files took 0.1758 seconds to load)
    6. 1 example, 0 failures

    查看firefox代理下的输出

  • 重构(示例三)

    以上只是一个简单的测试,所有的信息都杂糅在一个文件中,要让测试用例变得健壮,易阅读,易维护。那就是通过面向对象的方式,再加上逻辑和数据分离的方式来处理,这个才是自动化测试的核心思想。

    • 设计思路

      设想对登录进行手工测试,会想到一些测试用例(验证错误的用户名正确的密码;用户名和密码为空直接点击登陆按钮。等等),如果每个用例都要写一套代码的话,会发现有些地方出现代码重复,不利于测试代码的维护。进一步研究发现, 有些测试对象也是可以复用的,比如在登陆的时候我们会用到密码输入框、点击登录按钮等,可以把这些“基本动作”封装到一个类中,这样代码的灵活性和适用性 将会更强。即,面向对象编程。

    • 因此对测试目录结构做了一些调整:

      新建一个文件夹tool,用来定义一些获取控件的方法

      新建一个文件夹action,用来定义一下页面操作的方法

      新建一个文件夹spec,用来存放测试用例

      新建一个文件夹config,用来存放测试用例所涉及到的测试数据

    • 对于测试数据的管理,采用yaml来管理

      1. 在我们的工作目录下创建文件夹Login_Page (表示这个是一个登录页面的测试)

      2. 在Login_Page下分别创建文件夹tool,action,spec,config

      3. action文件夹中新建文件login_page.rb

      4. config文件夹中新建文件login_data.yml

      5. spec文件夹中新建文件login_cnblogs_spec.rb

      6. tool文件夹中新建文件login_dialog.rb

  • ../login/action/login_page.rb
    1. #encoding:utf-8
    2. require 'selenium-webdriver'
    3. require File.dirname(__FILE__)+'/../tool/login_dialog'
    4. class Login_Page
    5. include Login_Dialog
    6. def initialize(dr)
    7. @dr ||= dr
    8. end
    9. def login(username,passwd)
    10. get_username.send_keys(username)
    11. get_passwd.send_keys(passwd)
    12. get_submit.click
    13. end
    14. def message
    15. get_message.attribute("innerHTML")
    16. end
    17. end
  • ../login/config/login_data.yml
    1. data:
    2. mainpage:
    3. huburl: http://localhost:4444/wd/hub
    4. url: http://passport.cnblogs.com/login.aspx
    5. title: 用户登录 - 博客园用户中心
    6. logindata:
    7. wrong:
    8. username: weizhe_2008
    9. password: 12345678
    10. message: '用户名或密码错误<br><br>联系 contact@cnblogs.com'
  • ../login/spec/login_cnblogs_spec.rb
    1. #encoding:utf-8
    2. require 'selenium-webdriver'
    3. require 'rspec'
    4. require 'yaml'
    5. require File.dirname(__FILE__)+'/../tool/login_dialog'
    6. require File.dirname(__FILE__)+'/../action/login_page'
    7. describe 'cnblogs main login page' do
    8. include Login_Dialog
    9. before (:all) do
    10. @data = YAML.load (File.open(File.dirname(__FILE__)+'/../config/login_data.yml'))
    11. end
    12. before (:each) do
    13. @dr = Selenium::WebDriver.for(:remote,:url => @data["huburl"],:desired_capabilities => :firefox)
    14. @dr.navigate.to @data["url"]
    15. @dr.manage.window.maximize()
    16. @driver = Login_Page.new(@dr)
    17. end
    18. after (:each) do
    19. @dr.quit
    20. end
    21. context 'input the wrong passwd' do
    22. it 'login failed,and return "用户名或密码错误"' do
    23. @driver.login(@data["username"], @data["password"])
    24. sleep 10
    25. expect(@driver.message).to eql (@data["message"])
    26. end
    27. end
    28. end
  • ../login/tool/login_dialog.rb
    1. #encoding:utf-8
    2. require 'selenium-webdriver'
    3. module Login_Dialog
    4. def get_username
    5. @dr.find_element(:id,'input1')
    6. end
    7. def get_passwd
    8. @dr.find_element(:id,'input2')
    9. end
    10. def get_submit
    11. @dr.find_element(:id,'signin')
    12. end
    13. def get_message
    14. @dr.find_element(:id,'tip_btn')
    15. end
    16. end

../login/spec下运行

  1. :ruby Richard$ cd login
  2. :login Richard$ ls
  3. action config spec tool
  4. :login Richard$ cd spec/
  5. :spec Richard$ ls
  6. login_cnblogs_spec.rb
  7. :spec Richard$ rspec login_cnblogs_spec.rb --format doc

可以得到示例二中相同的结果

结束

Selenium (2) —— Selenium WebDriver + Grid2(101 Tutorial)的更多相关文章

  1. Selenium (3) —— Selenium IDE + Firefox录制登录脚本(101 Tutorial)

    Selenium (3) -- Selenium IDE + Firefox录制登录脚本(101 Tutorial) selenium IDE版本: 2.9.1 firefox版本: 39.0.3 参 ...

  2. Selenium (4) —— Selenium是什么? WebDriver是什么?做什么?(101 Tutorial)

    Selenium (4) -- Selenium是什么? WebDriver是什么?做什么?(101 Tutorial) selenium版本: v2.48.0 (Standalone Seleniu ...

  3. Selenium (1) —— Selenium安装与测试(101 Tutorial)

    Selenium (1) -- Selenium安装与测试(101 Tutorial) jvm版本: 1.8.0_65 selenium版本: v2.48.0 (Standalone Selenium ...

  4. JMeter (2) —— JMeter与WebDriver测试用户登陆以CAS SSO为例(101 Tutorial)

    JMeter (2) -- JMeter与WebDriver测试用户登陆以CAS SSO为例(101 Tutorial) 主要内容 JMeter与WebDriver测试用户登陆以CAS SSO为例 环 ...

  5. JMeter (1) —— JMeter与WebDriver安装与测试(101 Tutorial)

    JMeter (1) -- JMeter与WebDriver安装与测试(101 Tutorial) 主要内容 JMeter安装 WebDriver安装 一个简单的JMeter+WebDriver示例 ...

  6. JMeter (3) —— JMeter录制脚本并压力测试用户登陆场景以CAS SSO为例(101 Tutorial)

    JMeter (3) -- JMeter录制脚本并压力测试用户登陆场景以CAS SSO为例(101 Tutorial) 主要内容 JMeter录制脚本并进行压力测试用户登陆场景,并以CAS SSO单点 ...

  7. Sahi (1) —— 快速入门(101 Tutorial)

    Sahi (1) -- 快速入门(101 Tutorial) jvm版本: 1.8.0_65 sahi版本: Sahi Pro 6.1.0 参考来源: Sahi官网 Sahi Quick Tutori ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. pdm画表间结构

    PDM(物理概念模型)各种属性建立如PK,AK等 https://blog.csdn.net/qq_27376871/article/details/51321609 CDM: ER图详细教程 通常在 ...

  2. golang包time用法详解

    在我们编程过程中,经常会用到与时间相关的各种务需求,下面来介绍 golang 中有关时间的一些基本用法,我们从 time 的几种 type 来开始介绍. 时间可分为时间点与时间段,golang 也不例 ...

  3. Processing支持中文显示

    Processing 默认不支持中文,中文显示成框框,我使用的版本是:2.2.1,进行如下设置,并且重启processing就可以支持中文了: 可以看到中文了:

  4. 参数化查询 '(@ActualShipTime datetime' 需要参数 @AuthorizationNumber,但未提供该参数。

    转自 http://www.cnblogs.com/cxd4321/archive/2012/08/09/2629716.html 在平时的C#项目开发中,当调用某个存储过程或函数的时候,我们可能经常 ...

  5. php分享十八七:mysql基础

    mysql操作数据库代码: $link = @mysql_connect('localhost:3306', 'root', 'root') or die(mysql_error()); mysql_ ...

  6. Kubernetes的系统架构与设计理念

    Kubernetes与云原生应用简介 随着Docker技术的发展和广泛流行,云原生应用和容器调度管理系统也成为IT领域大热的词汇.事实上,云原生应用的思想,在Docker技术火爆之前,已经由云计算技术 ...

  7. Linux内核设计基础(一)之中断处理

    假设让内核定期对设备进行轮询.以便处理设备,那会做非常多无用功,假设能让设备在须要内核时主动通知内核,会是一个聪明的方式,这便是中断. 在响应一个特定中断时,内核会运行一个函数--中断处理程序. 中断 ...

  8. 服务端 https和SSL

    String keyStoreFilePassword = System .getProperty("keystore.file.password"); /usr/java/jdk ...

  9. [svc]java初步

    J2EE.J2SE 和 J2ME 三者的区别有哪些? J2SE, 主要是桌面软件开发,包括swing 等.是后面2个的基础,但是我们不用它做桌面开发.只学习语法. J2EE,网站开发,servlet. ...

  10. 基于 Promise 的 HTTP 请求客户端 axios

    基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 node.js 中使用 功能特性 在浏览器中发送 XMLHttpRequests 请求 在 node.js 中发送 http请求 支持 ...