jmeter应用WebDriver Sampler验证大文件分片上传

本文介绍了如何使用jmeter的WebDriver Sampler插件验证大文件分片上传。当文件大小超过1M时,系统会进行分片上传,传统接口调用无法模拟此过程。通过安装Selenium/WebDriver Support插件,设置Chrome Driver并编写WebDriver Sampler脚本,结合robot实现文件上传,从而完成大文件的浏览器模拟上传测试。

jmeter应用WebDriver Sampler验证大文件分片上传


一、背景

我们的系统中有文件上传功能,小文件可以直接通过调用文件上传接口进行验证,但系统对于超过1M的文件,会按1M大小进行拆分后分片上传,并支持断点上传。

通过Fiddler跟踪结果,会重复调用多个Upload,每个接口上传文件内容都为“blob”,而不是要上传的文件,通过接口调用方式无法模拟。如下图:
在这里插入图片描述
通过Jmeter的Plugins Manager,发现有Selenium相关插件,于是下载该插件,尝试模拟浏览器方式上传文件。


二、插件安装

  1. 安装插件管理器:Plugins Manager 下载地址:
    https://jmeter-plugins.org/downloads/all/

  2. 将下载的plugins-manager.jar放至jmeter目录下的lib/ext目录下,然后重启Jmeter,这时菜单->选项下会多出Plugins Manager菜单,打开即可对插件进行安装、升级。

  3. 打开Plugins Manager菜单,搜索“selenium”,可以搜索到Selenium/WebDriver Support插件,安装该插件。
    在这里插入图片描述

  4. 我们使用Chrome浏览器模拟,还需要下载chromedriver.exe


三、WebDriver Sampler应用

1.添加WebDriver Sampler取样器:

在这里插入图片描述

2.添加并配置Chrome Driver:

  1. 在WebDriver Sampler取样器下添加Chrome Driver Config的配置元件
    在这里插入图片描述
  2. 在WebDriver Sampler取样器下添加Chrome Driver Config的配置元件
    在Proxy中选择“Use system proxy settings”
    Path to Chrome Driver中填写chromedriver.exe的存放路径在这里插入图片描述
    在这里插入图片描述

3.编辑WebDriver Sampler脚本

因上传文件,需要调用系统文件进行上传,这里不是浏览器行为,我们使用robot方式上传
在这里插入图片描述
脚本如下:

//导入WebDriver相关包
import org.apache.jmeter.services.FileServer;
import org.openqa.selenium.*;
import org.openqa.selenium.interactions.Action;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import java.awt.event.KeyEvent;
import java.time.temporal.ChronoUnit;
import java.time.format.DateTimeFormatter;  
import java.time.LocalDateTime;   
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.FileWriter;
import java.util.concurrent.TimeUnit;
import java.util.ArrayList;
//import org.testng.asserts.SoftAssert;
import java.util.List;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.ui.ExpectedConditions;

//传入用户变量中定义的公告管理页面地址,用于上传文档
var vars = org.apache.jmeter.threads.JMeterContextService.getContext().getVariables();
var UpLoadUrl = vars.get('UpLoadUrl');
//import java.lang.String;
WebDriverWait wait= new WebDriverWait(WDS.browser,20);
WDS.sampleResult.sampleStart();

//启动浏览器
WDS.browser.get(UpLoadUrl);
//输入账号、密码,登录系统;
wait.until(ExpectedConditions.elementToBeClickable(By.name("user"))).sendKeys("admin");
//WDS.browser.findElement(org.openqa.selenium.By.name("user")).sendKeys("admin");
WDS.browser.findElement(org.openqa.selenium.By.name("pwd")).sendKeys("1");
WDS.browser.findElement(org.openqa.selenium.By.name("submit")).click();
//切换打开的上传文件页面
WDS.browser.switchTo().window(WDS.browser.getWindowHandle());
//点击上传按钮;
wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector('#appForm_Sub_FileNames > div > div > div.hc-upload-core.hc-file-upload__upload-btn > div.hc-upload-core__inner > button'))).click();
//使用Robot方式调用系统本地路径,上传文档,待上传文件所在目录为Jmeter脚本文件目录
filepath = vars.get("UploadFile"); 
Robot robot= new Robot();
robot.setAutoDelay(2000); 
//filepath="C:\\apache-jmeter-4.0\\bin\\FileBig.jpeg";
StringSelection stringselection = new StringSelection(filepath);
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringselection, null);

robot.setAutoDelay(1000);
WDS.log.info("Copy");
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
WDS.log.info("release");
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_V);
WDS.log.info("enter press release");
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
robot.setAutoDelay(2000);

//得到上传文档的documentid,用于数据库断言的条件
	WebDriverWait wait2= new WebDriverWait(WDS.browser,20);
	wait2.until(ExpectedConditions.presenceOfElementLocated(By.xpath('//*[@id="appForm_Sub_FileNames"]/div/div/div[2]/div/div/span[3]/a')));
	documentid = WDS.browser.findElement(org.openqa.selenium.By.xpath('//*[@id="appForm_Sub_FileNames"]/div/div/div[2]/div/div/span[3]/a')).getAttribute("href");
	  WDS.log.info('documentid: ' + documentid);
//	 }
WDS.vars.put("documentid", documentid);
WDS.log.info("Clicked on the submit button");

//var link = WDS.browser.findElement(pkg.By.cssSelector('#r1-0 > div > h2 > a.result__a > b')); //also saves selector as variable but uses CSS.
WDS.sampleResult.sampleEnd();

上传文件UploadFile使用的是相对路径,通过BeanShell 预处理程序处理,这里通过vars.get的方式引入,BeanShell 预处理程序脚本:

//将全局变量处理为当前进程可使用的变量,WebDriver没法使用Props的方式传入全局变量
String FileDir = FilenameUtils.getFullPathNoEndSeparator(GuiPackage.getInstance().getTestPlanFile());
UploadFileDir = FileDir + "\\UpLoadFile";
//filename为用户定义变量,用于定义待上传的文件名,如jmeter操作手册.pdf
String filename = vars.get("filename"); 

UploadFile = UploadFileDir+"\\"+filename;

vars.put("UploadFile",UploadFile);

log.info(".....1.UploadFile....."+UploadFile); 
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值