JMeter (2) —— JMeter与WebDriver测试用户登陆以CAS SSO为例(101 Tutorial)
JMeter (2) —— JMeter与WebDriver测试用户登陆以CAS SSO为例(101 Tutorial)
主要内容
- JMeter与WebDriver测试用户登陆以CAS SSO为例
环境与参考
jvm版本: 1.8.0_65
jmeter版本: 2.13
firefox版本: 39.0.3
参考来源:
Leverage your Load Testing using JMeter and Selenium WebDriver
jmeter-plugins.org:FirefoxDriverConfig
jmeter-plugins.org:WebDriverTutorial
jmeter-plugins.org:WebDriverSampler
Using Selenium with JMeter's WebDriver Sampler
准备
请参照JMeter (1) —— JMeter与WebDriver安装与测试(101 Tutorial) 安装好JMeter。
需要注意的是:
- 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.WebDriverScriptablepackage 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.Cookiepackage 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<WebElement> findElements(By paramBy); public abstract WebElement findElement(By paramBy); public abstract String getPageSource(); public abstract void close(); public abstract void quit(); public abstract Set<String> 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<String> 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<Cookie> 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
结束
JMeter (2) —— JMeter与WebDriver测试用户登陆以CAS SSO为例(101 Tutorial)的更多相关文章
- JMeter (3) —— JMeter录制脚本并压力测试用户登陆场景以CAS SSO为例(101 Tutorial)
JMeter (3) -- JMeter录制脚本并压力测试用户登陆场景以CAS SSO为例(101 Tutorial) 主要内容 JMeter录制脚本并进行压力测试用户登陆场景,并以CAS SSO单点 ...
- 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 ...
- JavaWeb基础之Servlet简单实现用户登陆
学习javaweb遇到了一些坑,一些问题总结下来,记个笔记. 学习servlet遇到的一些坑: servlet实现用户登陆遇到的坑解决办法: https://www.cnblogs.com/swxj/ ...
- JMeter (1) —— JMeter与WebDriver安装与测试(101 Tutorial)
JMeter (1) -- JMeter与WebDriver安装与测试(101 Tutorial) 主要内容 JMeter安装 WebDriver安装 一个简单的JMeter+WebDriver示例 ...
- 使用JMeter进行简单的压力测试
一.压力测试 顾名思义:压力测试,就是 被测试的系统,在一定的访问压力下,看程序运行是否稳定/服务器运行是否稳定(资源占用情况). 比如: 2000个用户同时到一个购物网站购物,这些用户打开页面的速 ...
- JMeter使用jar进行压力测试
最近需要对改造的redis缓存接口做压力测试,使用了开源压力测试工具JMeter,分享一下自己的使用经验,希望能对需要进行压力测试的开发同学有所帮助. JMeter介绍 JMeter是Apache软件 ...
- Windows和Linux的Jmeter分布式集群压力测试
Windows的Jmeter分布式集群压力测试 原文:https://blog.csdn.net/cyjs1988/article/details/80267475 在使用Jmeter进行性能测试时, ...
- Jemter 压测基础(一)——基本概念、JMeter安装使用、分布式测试、导出测试结果、编写测试报告
Jemter 压测基础(一) 1.压力测试的基本概念: 1.吞吐率(Requestspersecond) 服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请 ...
- JMeter性能(压力)测试--使用解锁
1. 首先去官网下载JMeter: http://jmeter.apache.org/download_jmeter.cgi 2. 解压缩后到目录 \apache-jmeter-5.0\bin 下找 ...
随机推荐
- Sublime Text增加Build system类型,打造一个全能IDE
Sublime text2是一款非常方便的文本编辑器,现在我基本上不用IDE去编写代码,一般都是在Sublime text2中编辑,当然,这里无法执行.debug是软肋,于是上网找了下资料,可以把添加 ...
- python标准库介绍——34 commands 模块详解
==commands 模块== (只用于 Unix) ``commands`` 模块包含一些用于执行外部命令的函数. [Example 3-7 #eg-3-7] 展示了这个模块. ====Exampl ...
- python标准库介绍——33 thread 模块详解
?==thread 模块== (可选) ``thread`` 模块提为线程提供了一个低级 (low_level) 的接口, 如 [Example 3-6 #eg-3-6] 所示. 只有你在编译解释器时 ...
- U811.1接口EAI系列之三--采购订单生成--VB语言
采购订单业务,下面是具体代码与参数说明: 下面调用的通用方法在: http://www.cnblogs.com/spring_wang/p/3393147.html 作者:王春天 2013-10-31 ...
- fdatool的滤波器设计
作者:桂. 时间:2017-08-15 20:28:11 链接:http://www.cnblogs.com/xingshansi/p/7367738.html 前言 本文主要记录滤波器设计的基本流 ...
- ansible 学习记录
Ansible 的重新学习记录 这里我的Ansible的宿主机是centos 7.2系统,这里我通过yum 安装Ansible 1.配置epel源 sudo yum -y install epel-r ...
- 关于 NSInvocation
Invocation 调用的意思. 可想而知NSInvocation 是一个 方法调用 封装的类. 这体现了 面向对象的思想, 及一切皆对象.函数也不例外. 一般编程中,应该很少用到这个. 但是 ...
- Java操作XML的JAXB工具
在java中操作XML的工作中中,比较方便的工具是JAXB(Java Architecture for XML Binding). 利用这个工具很方便生成XML的tag和Java类的对应关系.参照网上 ...
- JAVA之堆内存和栈内存的差别
欢迎转载.请附上出处: http://blog.csdn.net/as02446418/article/details/47007975 笔者近期在准备面试的时候又一次看了一些JAVA基础的知识,以下 ...
- CentOS 7 安装开发者环境
在vagrant box中安装了基本的centos7的box,但是,该环境没有安装编译软件,所以要求自行安装. 1.查看群组安装的源包数量: yum group list ,搜索Development ...