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

主要内容

JMeter与WebDriver测试用户登陆以CAS SSO为例

环境与参考

jvm版本: 1.8.0_65

jmeter版本: 2.13

firefox版本: 39.0.3

参考来源:

准备

需要注意的是:

JMeter的版本

jar依赖冲突

firefox版本

待测试的CAS环境

架构

配置

请参照以下文章搭建配置好CAS单点登陆的本地环境。

测试

注意:我们这里只是以CAS单点登陆为应用场景进行测试,此测试可以推广到其他的web应用的登陆场景,也可以扩展到更为丰富的流程或场景中。

准备

新建测试计划(TestPlan)

为测试计划添加线程组(TheadGroup)

依次添加

jp@gc - Firefox Driver Config (Thread Group -> Config Element)

jp@gc - WebDriver Sampler (Thread Group -> Sampler)

View Results Tree (Thread Group -> Listender)

View Results in Table (Thread Group -> Listender)

测试本地的CAS单点登陆环境

脚本

try {

var pkg = JavaImporter(org.openqa.selenium, org.openqa.selenium.support.ui)

WDS.log.info('WDS Name:' + WDS.name)

WDS.sampleResult.sampleStart()

WDS.browser.navigate().to('https://app2.hoau.com:8423/cas2')

WDS.log.info('Browser Title:' + WDS.browser.getTitle())

WDS.log.info('Browser CurrentUrl:' + WDS.browser.getCurrentUrl())

WDS.log.info('Cookie:' + WDS.browser.manage().getCookies())

WDS.log.info('Request Header: ' + WDS.sampleResult.getRequestHeaders())

var what = WDS.browser.findElement(pkg.By.id('username'))

what.sendKeys(['test01'])

var where = WDS.browser.findElement(pkg.By.id('password'))

where.sendKeys(['psw01'])

// var button = WDS.browser.findElement(pkg.By.cssSelector('.btn-submit'))

var button = WDS.browser.findElement(pkg.By.xpath("//input[@type='submit']"))

button.click()

var wait = new pkg.WebDriverWait(WDS.browser, 10)

wait.until(pkg.ExpectedConditions.presenceOfElementLocated(pkg.By.xpath("//a[@title='Click here to log out']")))

var results = WDS.browser.findElements(pkg.By.xpath("//a[@title='Click here to log out']"))

WDS.log.info('Result: ' + results)

if(results.empty) {

WDS.sampleResult.successful = false

WDS.sampleResult.responseMessage = 'There were no results returned'

}

var iter = results.iterator()

var element = iter.next()

WDS.log.info('User: ' + element.getText())

if('test01' != element.getText()) {

WDS.sampleResult.successful = false

WDS.sampleResult.responseMessage = 'Login Failure'

}

WDS.sampleResult.sampleEnd()

} catch(ex) {

WDS.log.error(ex)

WDS.sampleResult.successful = false

WDS.sampleResult.responseMessage = 'There were no results returned'

WDS.sampleResult.sampleEnd()

}

运行

查看“View Results in Table”

查看“View Results Tree”

需要注意的是,诸如JMeter + WebDriver Plugin或Selenium Grid + Remote WebDriver抑或Sahi Web UI这些方式的测试,都是试图模拟用户从终端(浏览器)与服务器进行真实交互,以上这些方式长于流程、场景,而非服务端的压力(当然也可用于服务端压力测试之目的,这里强调的只是意图),如果要对服务端进行压力测试,我们可以有其他更为适合的方式。

测试cnblogs登陆

我们同样可以cnblogs为目标系统,尝试用JMeter来测试cnblogs的登陆。

脚本

try {

var pkg = JavaImporter(org.openqa.selenium, org.openqa.selenium.support.ui)

WDS.log.info('WDS Name:' + WDS.name)

WDS.sampleResult.sampleStart()

WDS.browser.navigate().to('http://passport.cnblogs.com/user/signin')

WDS.log.info('Browser Title:' + WDS.browser.getTitle())

WDS.log.info('Browser CurrentUrl:' + WDS.browser.getCurrentUrl())

WDS.log.info('Cookie:' + WDS.browser.manage().getCookies())

WDS.log.info('Request Header: ' + WDS.sampleResult.getRequestHeaders())

var what = WDS.browser.findElement(pkg.By.id('input1'))

what.sendKeys(['weizhe_2008'])

var where = WDS.browser.findElement(pkg.By.id('input2'))

where.sendKeys(['********'])

var button = WDS.browser.findElement(pkg.By.id('signin'))

button.click()

var wait = new pkg.WebDriverWait(WDS.browser, 1)

// a href="http://home.cnblogs.com/u/richaaaard/"

wait.until(pkg.ExpectedConditions.presenceOfElementLocated(pkg.By.xpath("//a[@href='http://www.cnblogs.com/richaaaard/']")))

var results = WDS.browser.findElements(pkg.By.xpath("//a[@href='http://www.cnblogs.com/richaaaard/']"))

WDS.log.info('Result: ' + results)

if(results.empty) {

WDS.sampleResult.successful = false

WDS.sampleResult.responseMessage = 'There were no results returned'

}

WDS.sampleResult.sampleEnd()

} catch(ex) {

WDS.log.error(ex)

WDS.sampleResult.successful = false

WDS.sampleResult.responseMessage = 'There were no results returned'

WDS.sampleResult.sampleEnd()

}

运行

结果

问题

由于此种测试模式下,我们会使用JMeter配置的Firefox Driver Config组件,同时使用WDS(Web Driver Sampler)Script在JMeter UI环境下测试目标应用,当Thread Group 的循环次数(Loop Count)或线程数(Number of Threads (user))的值大于1时,当前线程关联的浏览器代理实例一直处于生命期,而单点登陆会保留用户的登陆信息,无需反复输入用户名密码,浏览器保持了这些信息,因此后面断言会出现错误,脚本无法反复执行从而达到为“验证用户名密码这个流程”进行压力测试的目的。

经研究,当前版本的JMeter及其使用的Selenium WebDriver Plugin除PhantomJS外,不支持动态修改Session Cookie,而网上多数文章介绍的相关Cookie的API,无法对浏览器Session Cookie进行操作。

WDS.browser.manage().getCookies()

WDS.browser.manage().deleteAllCookies()

我们会使用HTTPs录制的方式来解决压力测试的问题。

扩展

为了解WDS 在JMeterUI下javascript脚本的能力,以及涉及到面问题相关的源码。

WDS (JMeterPlugins-WebDriver.jar)

com.googlecode.jmeter.plugins.webdriver.sampler.WebDriverSampler

com.googlecode.jmeter.plugins.webdriver.sampler.WebDriverScriptable

package com.googlecode.jmeter.plugins.webdriver.sampler;

import org.apache.jmeter.samplers.SampleResult;

import org.apache.log.Logger;

import org.openqa.selenium.WebDriver;

public final class WebDriverScriptable

{

private static final String[] EMPTY_ARGS = new String[0];

private String name;

private String parameters;

private Logger log;

private WebDriver browser;

private SampleResult sampleResult;

public void setName(String name)

{

this.name = name;

}

public String getName() {

return this.name;

}

public void setParameters(String parameters) {

this.parameters = parameters;

}

public String getParameters() {

return this.parameters;

}

public String[] getArgs() {

return this.parameters != null ? this.parameters.trim().replaceAll("\\s+", " ").split(" ") : EMPTY_ARGS;

}

public void setLog(Logger log) {

this.log = log;

}

public Logger getLog() {

return this.log;

}

public void setBrowser(WebDriver browser) {

this.browser = browser;

}

public WebDriver getBrowser() {

return this.browser;

}

public void setSampleResult(SampleResult sampleResult) {

this.sampleResult = sampleResult;

}

public SampleResult getSampleResult() {

return this.sampleResult;

}

}

WDS.browser (WebDriver - selenium-api-2.47.0.jar)

org.openqa.selenium.WebDriver

org.openqa.selenium.Cookie

package org.openqa.selenium;

import java.net.URL;

import java.util.List;

import java.util.Set;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.logging.Logs;

public abstract interface WebDriver extends SearchContext

{

public abstract void get(String paramString);

public abstract String getCurrentUrl();

public abstract String getTitle();

public abstract List findElements(By paramBy);

public abstract WebElement findElement(By paramBy);

public abstract String getPageSource();

public abstract void close();

public abstract void quit();

public abstract Set getWindowHandles();

public abstract String getWindowHandle();

public abstract TargetLocator switchTo();

public abstract Navigation navigate();

public abstract Options manage();

@Beta

public static abstract interface Window

{

public abstract void setSize(Dimension paramDimension);

public abstract void setPosition(Point paramPoint);

public abstract Dimension getSize();

public abstract Point getPosition();

public abstract void maximize();

}

public static abstract interface ImeHandler

{

public abstract List getAvailableEngines();

public abstract String getActiveEngine();

public abstract boolean isActivated();

public abstract void deactivate();

public abstract void activateEngine(String paramString);

}

public static abstract interface Navigation

{

public abstract void back();

public abstract void forward();

public abstract void to(String paramString);

public abstract void to(URL paramURL);

public abstract void refresh();

}

public static abstract interface TargetLocator

{

public abstract WebDriver frame(int paramInt);

public abstract WebDriver frame(String paramString);

public abstract WebDriver frame(WebElement paramWebElement);

public abstract WebDriver parentFrame();

public abstract WebDriver window(String paramString);

public abstract WebDriver defaultContent();

public abstract WebElement activeElement();

public abstract Alert alert();

}

public static abstract interface Timeouts

{

public abstract Timeouts implicitlyWait(long paramLong, TimeUnit paramTimeUnit);

public abstract Timeouts setScriptTimeout(long paramLong, TimeUnit paramTimeUnit);

public abstract Timeouts pageLoadTimeout(long paramLong, TimeUnit paramTimeUnit);

}

public static abstract interface Options

{

public abstract void addCookie(Cookie paramCookie);

public abstract void deleteCookieNamed(String paramString);

public abstract void deleteCookie(Cookie paramCookie);

public abstract void deleteAllCookies();

public abstract Set getCookies();

public abstract Cookie getCookieNamed(String paramString);

public abstract WebDriver.Timeouts timeouts();

public abstract WebDriver.ImeHandler ime();

@Beta

public abstract WebDriver.Window window();

@Beta

public abstract Logs logs();

}

}

以上要注意内部静态类 Options里面提供的,对Cookie进行操作的API

结束

jmeterweb登陆测试_JMeter (2) —— JMeter与WebDriver测试用户登陆以CAS SSO为例(101 Tutorial)...相关推荐

  1. ajax登陆返回值判断,一个简单的ajax用户登陆返回值问题?有代码

    一个简单的ajax用户登陆返回值问题?有代码 來源:互聯網  2009-11-13 11:55:56  評論 分類: 電腦/網絡 >> 程序設計 >> 其他編程語言 問題描述: ...

  2. php制作简单的用户登陆,如何用php代码实现简单的用户登陆以及登陆验证功能

    本文主要简单讲述了如何使用php实现简单的用户登陆以及登陆验证效果. 1.首先实现通过Session实现用户的登录 那么什么是session呢? session被译为会话,它主要是为了在一定访问期间在 ...

  3. JMeter 测试组件介绍 - 物联网大并发测试实战 02

    在本系列文章的上一篇中,我们介绍了开源测试工具 JMeter,并以一个简单的HTTP测试为例一窥JMeter的能力.在本篇文章中,我们将进一步介绍JMeter丰富的组件,以帮助大家构建复杂场景的测试脚 ...

  4. 在ASP.NET Core微服务架构下使用数据库切分和扩展, 并用JMeter进行负载测试

    原文链接:https://itnext.io/how-to-scale-an-asp-net-core-microservice-and-sharded-database-load-test-with ...

  5. 接口压力测试:Postman【Postman通常用于做接口测试,同时也可以用于作为压力测试】、Jmeter【专门做压力测试】、Loadrunner、Apache AB、Webbench

    做开发的同学一定会遇到接口对接,今天介绍两个对接测试两个我个人认为比较好的测试工具 postman和jmeter 1.postman通常用于做接口测试,同时也可以用于作为压力测试 2.jmeter做压 ...

  6. 人人网模拟用户登陆行为后进入包贝尔的个人主页

    在人人网模拟用户登陆行为后进入包贝尔的个人主页 (用户登陆URL:http://www.renren.com/PLogin.do 包贝尔的人人网个人页面URL:http://www.renren.co ...

  7. 警惕黑客使用Lion系统漏洞破解和修改用户登陆密码

    转载自:http://www.techolics.com/apple/20110922_72.html 9月19日,星期一,名为Patrick Dunstan的黑客公布了如何利用苹果最新Lion操作系 ...

  8. jsp的MVC模式设计用户登陆注册

    jsp的MVC模式设计用户登陆注册 用户登陆功能 1.实验内容 2.实验步骤 3.实验结果 4.实验分析 用户登陆功能 通过设计用户的登陆和注册,来学习jsp的MVC模式,熟练掌握MVC模式各部分的内 ...

  9. jmeter数据库负载测试_JMeter:负载测试关系数据库

    jmeter数据库负载测试 Apache JMeter是完全使用Java编写的性能测试工具. 可以在请求/响应模型上运行的任何应用程序都可以使用JMeter进行负载测试. 关系数据库也不例外:接收sq ...

  10. 网站压力测试软件(Apache JMeter)2.13 官方版 Error: Unable to access jarfile ApacheJMeter.jar

    https://jmeter.apache.org/download_jmeter.cgi  官网 https://archive.apache.org/dist/jmeter/binaries/  ...

最新文章

  1. git 提交跳过检查
  2. Notepad2 一个很不错的记事本
  3. 将keepalived添加到系统服务中
  4. Struts+DAO框架搭建完成!(源码)
  5. spring IoC/DI
  6. 智慧发电厂+智能发电厂web端平台管理系统+Axure高保真智慧电厂系统+能耗管理+告警管理+生产监控+安防设备管理+运维设备管理+监控面板+系统管理+智慧电厂+电厂系统+axure源文件+rp原型
  7. 一文了解电竞游戏平台的大数据玩法儿!
  8. 如何提高lstm的预测精度_直线电机点胶机如何提高点胶精度及生产效率?
  9. 运维系统 联想服务器,联想运维方案.pdf
  10. 中国省市县JSON字符串(String)数据、2020年的数据、2021年12月整理
  11. 多级小波分解网络:可解释的时间序列分析
  12. 电脑版的微信客户端也能刷朋友圈啦
  13. 计算机三级网络技术知识点大全(九)
  14. 三轴加速度计计算俯仰角、横滚角、偏航角
  15. 国漫的又一次崛起?形成独树一帜的“中国学派”
  16. Qt TCP/UDP局域网通信软件 模仿QQ TIM
  17. JavaScript 数据类型的转换
  18. Uber的成功绝非偶然
  19. 《Python语言程序设计》王恺 王志 李涛 机械工业出版社 第3章 函数 课后习题答案【强烈推荐】
  20. 滴!您有一份《程序猿耍帅秘籍》,请及时处理

热门文章

  1. Word 2013 无法撤销操作的错误
  2. TortoiseGit - 详细提交流程
  3. nmos导通流向_讨论一下:用NMOS还是PMOS关断好? - 模拟与混合信号 - 电子工程世界-论坛 - 手机版...
  4. 简单易操作Jsp动态网页
  5. mac显示所有文件后缀名
  6. cubic算法优化_CUBIC拥塞拥塞控制算法
  7. r语言 rgl 强制过程中_R语言中编写最小工作示例(MWRE)
  8. pm8060raid卡命令
  9. 二元函数偏导数的几何意义
  10. 使用Matlab对大地测量学中的大地坐标和大地空间直角坐标进行相互转换