最近写自动化用例,场景涉及到对git仓库文件的增,删,改,最开始想着通过selenium对git进行模拟手工操作,但使用selenium登录页面,打开页面地址后才发现,无法定位到需要的元素,git是通过script脚本调用接口来实现对文件的增删改,最后一通折腾,把它调用的接口扒出来,调用接口慢慢试,把接口需要的一些参数凑齐了,其中主要的cookie是使用driver获取的,token从页面元素中扒出来的
一、前置操作-登录,打开页面
使用@BeforeClass,将浏览器的登录操作在用例执行前进行,需要注意的是使用的浏览器是chrome,selenium是没有对应的驱动的,需要在之前设置,我使用相对路径将chromeDriver.exe放在项目路径下(各版本chromdriver下载地址)
@BeforeClass
public void initDriver(){
System.setProperty("webdriver.chrome.driver","src\\test\\resources\\chromedriver.exe");//设置系统属性,设置chrome驱动位置
driver = new ChromeDriver();
GitOperation.gitLogin(driver);//登录git
logger.info("开始执行普通配置文件自动任务扫描测试用例");
}
登录操作:
可以使用页面工厂对页面元素进行管理,因git一般元素是固定的我就直接写在里面了
public static void gitLogin(WebDriver driver){
driver.get("http://git.se.dooioo.com/users/sign_in");//git登录地址 一下为对git进行登录
WebElement user = driver.findElement(By.id("username"));
WebElement password = driver.findElement(By.id("password"));
WebElement sign = driver.findElement(By.name("commit"));
user.clear();
user.sendKeys("1111");
password.clear();
password.sendKeys("1111");
sign.click();
}
二、获取浏览器的cookie塞入接口请求的header中
使用getCookies()获取浏览器的cookie,并将他的name,value循环放入一个list中
/*
获取浏览器的cookie,将其塞入header中
*/
public static HttpHeaders getHeader(WebDriver driver){
HttpHeaders headers = new HttpHeaders();
Set<Cookie> cookies = driver.manage().getCookies();//获取浏览器cookies
List<String> cookieList = new ArrayList<String>();
for(Cookie cookie:cookies){ //将浏览器cookies放入list中
//System.out.println("当前cookies为:" + cookie.getDomain() + " " + cookie.getName() + ":" + cookie.getValue());
cookieList.add(cookie.getName() + "=" + cookie.getValue());
}
//System.out.println("cookie为:" + cookieList.toString());
headers.put(HttpHeaders.COOKIE,cookieList); //将cookie放入header
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);//post表单 ,如果是个json则设置为MediaType.APPLICATION_JSON
return headers;
}
三、打开页面,获取token
打开url,从页面元素中奖token扒出来
/*
获取页面的authenticity_token
*/
public static String getToken(WebDriver driver,String url){
driver.get(url);
WebElement token = driver.findElement(By.name("authenticity_token"));//获取token
String authenticity_token = token.getAttribute("value");//获取value属性值
return authenticity_token;
}
四、调用接口,实现文件的新增
接口的调用可参考我的另一篇文章RestTemplate接口请求总结
/*
git新建一个文件
uploadUrl :新建文件的url地址
contetn :新建文件的内容
*/
public static void gitUpLoad(WebDriver driver,String uploadUrl,String fileName,String content,String branch,String requestUrl) throws Exception{
String authenticity_token = getToken(driver,uploadUrl);//获取token
RestTemplate template = new RestTemplate();
HttpHeaders headers = getHeader(driver);//获取header
MultiValueMap<String,String> param = new LinkedMultiValueMap<String, String>();//参数放入一个map中,restTemplate不能用hashMap
//将请求参数放入map中
param.add("authenticity_token",authenticity_token);
param.add("file_name",fileName);
param.add("encoding","text");
param.add("commit_message","addFile");
param.add("target_branch",branch);
param.add("original_branch",branch);
param.add("content",content);
param.add("utf8","✓");
//System.out.println("参数内容为:" + param.toString());
HttpEntity<MultiValueMap<String,String>> request = new HttpEntity<MultiValueMap<String,String>>(param,headers);//将参数和header组成一个请求
ResponseEntity<String> response = template.postForEntity(requestUrl, request, String.class);
}