selenium与http结合实现附件上传

背景:

​ 项目中需要进行多个多附件上传,且需要保证每个附件都进行上传,缺少一个附件也不能进行提交操作。这样通过sendkey的方式无法判断上传完成的时机,进行附件上传成功与否的判断就比较复杂。在此情况下,想到了通过selenium和http结合的方式进行附件处理,保证表单所有附件都正确上传后再进行表单提交。

思路:

1.获取附件上传链接

2.获取附件上传所需要的cookie以及参数

3.进行附件上传

4.查看上传成功后的处理,执行js进行处理

代码如下

//获取cookies
Set<Cookie> cookieSet = browser.manage().getCookies();
HttpCookie[] cookies = new HttpCookie[cookieSet.size()];
StringBuilder stringBuilder = new StringBuilder();
int index=0;
for(Cookie cookie:cookieSet){
    cookies[index]=new HttpCookie(cookie.getName(),cookie.getValue());
    stringBuilder.append(cookie.getName())
        .append("=")
        .append(cookie.getValue())
        .append(";")
        ;
    index++;
}
String cookiesStr = stringBuilder.substring(0,stringBuilder.length()-1);
//调用http接口进行附件上传
String result = HttpUtil.createPost("")
    .cookie(cookies)
    .header(Header.COOKIE,cookiesStr)
    .header(Header.HOST,"ssfw.gdcourts.gov.cn")
    .form("file",new File(""))
    .execute()
    .body();
//获取执行结果
JSONObject data = JSON.parseObject(result);
//判断上传是否成功并进行处理
if (!data.getBoolean("success")){
	log.info("上传失败");
}else {
    //判断是否成功
    //进行js处理
    String attachments = "";
    String fjlx = "";
    String js = "var attachments = arguments[0];\n" +
    "var fjlx = arguments[1];\n" +
    "var data = arguments[2];\n" +
    "function addFileByjs(){\n" +
    "\tif($.trim(data.fjList)!=''){\n" +
    "\t\tvar fjpdf = \"1\";\n" +
    "\t\tfor(var i=0;i<data.fjList.length;i++){\n" +
    "\t\t\tvar fj = data.fjList[i];\n" +
    "\t\t\tvar suffix = fj.fjmc.substring(fj.fjmc.lastIndexOf('.')+1);\n" +
    "\t\t\tif(suffix == 'pdf'){\n" +
    "\t\t\t\tfjpdf = '2';\n" +
    "\t\t\t}\n" +
    "\t\t\tvar len = $('#'+attachments).find(\".attachment_cls\").length+1;\n" +
    "\t\t\tvar mc = W21Json[fjlx];\n" +
    "\t\t\t//替换特殊字符\n" +
    "\t\t\tvar fjmcTmp = filterSpecialChar(fj.fjmc);\n" +
    "\t\t\tvar zjmc = mc+\"_\"+len+\"(\"+fjmcTmp+\")\";\n" +
    "\t\t\tvar clone = $(\"#attachment_div\").clone(true);\n" +
    "\t\t\tclone.removeAttr(\"id\");\n" +
    "\t\t\tclone.find(\".zjxxs_fjmc\").attr({\n" +
    "\t\t\t\t\"href\":\t\"javascript:void(0);\",\n" +
    "\t\t\t\t\"onclick\":\"funClxxUpload_wzh(this,'\"+fjm+\"');\",\n" +
    "\t\t\t\t\"htitle\": zjmc,\n" +
    "\t\t\t\t\"fjmc\":fjmcTmp\n" +
    "\t\t\t}).append(zjmc);\n" +
    "\t\t\tclone.find(\"input[name='zjxxs.fjid']\").val(fj.fjid);\n" +
    "\t\t\tclone.find(\"input[name='zjxxs.lx']\").val(fjlx);\n" +
    "\t\t\tclone.find(\"input[name='zjxxs.zjmc']\").val(zjmc);\n" +
    "\t\t\tclone.appendTo(\"#\"+attachments);\n" +
                    "\t\t}\n" +
                    "\t}\n" +
                    "}\n" +
                    "addFileByjs();";
	((JavascriptExecutor) browser).executeScript(js,attachments,fjlx,data);
}

executeScript调用js的注意事项见下节内容