用WebDriver实现基于jira过滤器视图的统计自动化
在Jira上通过过滤器我们可以做出多种视图,以方便统计我们想要收集的结果。比如:我想查看所有分派给我的任务。在Jira上,我保存了一个过滤器,叫做“分派给我的所有任务”。这个过滤器可以过滤出所有分配给我的任务。下面我要对每一个分配给我的任务做一下统计,收集一些关键的字段值,并输出到excel表:

利用WebDriver实现,代码如下:
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import javax.swing.filechooser.FileSystemView; import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver; import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException; public class TestInfoGet { public static void main(String[] args) throws InterruptedException, IOException {
String webUrl = "http://jira.ms.netease.com/browse/LOTTERY-xxx?filter=xxxx";
WebDriver webDriver = new FirefoxDriver();
webDriver.get(webUrl);
waitUntilPageLoadedId(webDriver, "login-form-username");
webDriver.findElement(By.id("login-form-username")).sendKeys("username");
webDriver.findElement(By.id("login-form-password")).sendKeys("password");
webDriver.findElement(By.id("login-form-submit")).click();
webDriver.get(webUrl); // Main title.
waitUntilPageLoadedId(webDriver, "search-header-view");
String mainTitle = webDriver.findElement(By.id("search-header-view")).findElement(By.className("search-title"))
.getText();
System.out.println(mainTitle); // Write an excel.
try {
FileSystemView fsv = FileSystemView.getFileSystemView();
WritableWorkbook book = Workbook
.createWorkbook(new File(fsv.getHomeDirectory() + "\\" + mainTitle + ".xls"));
WritableSheet sheet = book.createSheet(mainTitle, 0);
List<String> labels = Arrays.asList("活动名称", "JIRA链接", "类型", "状态", "优先级", "解决结果", "模块", "平台", "测试类型", "bug数",
"用例数据", "报告人", "产品人员", "前端", "开发", "分派给");
for (int i = 0; i < labels.size(); i++) {
sheet.addCell(new Label(i, 0, labels.get(i)));
} // Get all sub titles.
waitUntilPageLoadedClass(webDriver, "issue-list");
WebElement webElement = webDriver.findElement(By.className("issue-list"));
List<WebElement> webElements = webElement.findElements(By.tagName("li"));
List<String> titles = new ArrayList<String>();
for (WebElement webElement2 : webElements) {
titles.add(webElement2.getAttribute("title"));
} // For each sub title.
for (int i = 1; i <= titles.size(); i++) {
String xPath = "//*[@title='" + titles.get(i - 1) + "']";
webDriver.findElement(By.xpath(xPath)).click();
waitUntilPageLoadedId(webDriver, "issue-content");
Thread.sleep(1000);
System.out.println("--------------------------------------------");
// Get the JIRA link.
System.out.println("活动名称:" + webDriver.findElement(By.id("summary-val")).getText());
sheet.addCell(new Label(0, i, webDriver.findElement(By.id("summary-val")).getText()));
String href = webDriver.findElement(By.id("key-val")).getAttribute("href");
// String link = "http://jira.ms.netease.com/browse/" + href;
System.out.println("JIRA链接:" + href);
sheet.addCell(new Label(1, i, href + " "));
waitUntilPageLoadedId(webDriver, "issuedetails");
// Issue details.
WebElement issueDetails = webDriver.findElement(By.id("issuedetails"));
String detailName, detailValue;
for (WebElement issueDetail : issueDetails.findElements(By.tagName("li"))) {
detailName = issueDetail.getText().split(":")[0];
detailValue = issueDetail.getText().split(":")[1].replaceAll("\n", "").split(" ")[0];
System.out.println(detailName + ":" + detailValue);
sheet = insertData(detailName, detailValue, sheet, i);
}
// Custom field module.
try {
WebElement customModule = webDriver.findElement(By.id("customfieldmodule"));
String moduleText, moduleName, moduleValue;
for (WebElement cModule : customModule.findElements(By.className("item"))) {
moduleText = cModule.getText().replaceAll("\n", "");
System.out.println(moduleText);
moduleName = moduleText.split(":")[0];
moduleValue = moduleText.split(":")[1];
sheet = insertData(moduleName, moduleValue, sheet, i);
}
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.toString());
}
// Participates.
WebElement pd = webDriver.findElement(By.id("peoplemodule"))
.findElement(By.className("people-details"));
String pCategory, pName;
for (WebElement webElement3 : pd.findElements(By.tagName("dl"))) {
System.out.println(webElement3.findElement(By.tagName("dt")).getText()
+ webElement3.findElement(By.tagName("dd")).getText());
pCategory = webElement3.findElement(By.tagName("dt")).getText().split(":")[0];
pName = webElement3.findElement(By.tagName("dd")).getText();
sheet = insertData(pCategory, pName, sheet, i);
}
}
book.write();
book.close();
} catch (WriteException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} } private static WritableSheet insertData(String name, String value, WritableSheet sheet, int i)
throws RowsExceededException, WriteException {
// TODO Auto-generated method stub
int j = 16;
switch (name) {
case "类型":
j = 2;
sheet.addCell(new Label(j, i, value));
break;
case "状态":
j = 3;
sheet.addCell(new Label(j, i, value));
break;
case "优先级":
j = 4;
sheet.addCell(new Label(j, i, value));
break;
case "解决结果":
j = 5;
sheet.addCell(new Label(j, i, value));
break;
case "模块":
j = 6;
sheet.addCell(new Label(j, i, value));
break;
case "平台":
j = 7;
sheet.addCell(new Label(j, i, value));
break;
case "测试类型":
j = 8;
sheet.addCell(new Label(j, i, value));
break;
case "bug数":
j = 9;
sheet.addCell(new Label(j, i, value));
break;
case "用例数据":
j = 10;
sheet.addCell(new Label(j, i, value));
break;
case "用例数":
j = 10;
sheet.addCell(new Label(j, i, value));
break;
case "报告人":
j = 11;
sheet.addCell(new Label(j, i, value));
break;
case "产品人员":
j = 12;
sheet.addCell(new Label(j, i, value));
break;
case "前端":
j = 13;
sheet.addCell(new Label(j, i, value));
break;
case "开发":
j = 14;
sheet.addCell(new Label(j, i, value));
break;
case "分派给":
j = 15;
sheet.addCell(new Label(j, i, value));
break;
}
return sheet;
} private static void waitUntilPageLoadedId(WebDriver iw, String v) throws InterruptedException {
try {
iw.findElement(By.id(v));
} catch (Exception ex) {
System.out.println(ex.toString());
Thread.sleep(1000);
waitUntilPageLoadedId(iw, v);
}
} private static void waitUntilPageLoadedClass(WebDriver iw, String v) throws InterruptedException {
try {
iw.findElement(By.className(v));
} catch (Exception ex) {
System.out.println(ex.toString());
Thread.sleep(1000);
waitUntilPageLoadedClass(iw, v);
}
} }
用WebDriver实现基于jira过滤器视图的统计自动化的更多相关文章
- Django编写RESTful API(三):基于类的视图
欢迎访问我的个人网站:www.comingnext.cn 前言 在上一篇文章中,主要讲的是请求和响应,项目里面views.py中的视图函数都是基于函数的,并且我们介绍了@api_view这个很有用的装 ...
- Django REST FrameWork中文教程3:基于类的视图
我们也可以使用基于类的视图编写我们的API视图,而不是基于函数的视图.我们将看到这是一个强大的模式,允许我们重用常用功能,并帮助我们保持代码DRY. 使用基于类的视图重写我们的API 我们将首先将根视 ...
- django-rest-framework之基于类的视图
前言:上一篇博客中,主要讲的是请求和响应,项目里面views.py中的视图函数都是基于函数的,并且我们介绍了@api_view这个很有用的装饰器.同时,我们还介绍了APIView这个类,但是还没使用它 ...
- django 中基于类的视图
django 视图 分为两种: 1. FBV 基于函数的视图 function based view 2. CBV 基于类的视图 class based ...
- 介绍——基于类的视图(class-based view)
刚开始的时候,django只有基于函数的视图(Function-based views).为了解决开发视图中繁杂的重复代码,基于函数的通用视图( Class-based generic views) ...
- Django 基于类的视图(CBV)执行流程 CBV 源码分析
一.CBV(基于类的视图) 视图是可以调用的,它接受请求并返回响应,这不仅仅是一个函数,Django提供了一些可以用作视图的类的例子,这些允许您通过继承或mixin来构建视图并重用代码. 基本示例 D ...
- Django——基于类的视图源码分析 一
基于类的视图(Class-based view)是Django 1.3引入的新的视图编写方式,用于取代以前基于函数(Function-based)方式. 借助于OO和Python中方便的多重继承特性, ...
- Django——基于类的视图源码分析 二
源码分析 抽象类和常用视图(base.py) 这个文件包含视图的顶级抽象类(View),基于模板的工具类(TemplateResponseMixin),模板视图(TemplateView)和重定向视图 ...
- Django——基于类的视图(class-based view)
刚开始的时候,django只有基于函数的视图(Function-based views).为了解决开发视图中繁杂的重复代码,基于函数的通用视图( Funcation-based generic vie ...
随机推荐
- The Havel-Hakimi Algorithm
1.If any di>=n then fail 2.If there is an odd number of odd degrees then fail 3.If there is a di& ...
- 前端新手分析 AJAX执行顺序,数据走向
我是一名前端的newer 在刚学习AJAX和eJS的时候,对于顺序上面有很大迷惑,现在稍微清楚了一点, 理解不对的地方,还请各位大牛帮助给我指导一下. 总的 服务器和客户端的顺序 一. 除了必要的 ...
- C# 动态链接库的创建
首先在C#工程下面安装第三方插件包 安装方法:Tools --> Library Package Manager --> Package Manager Console Install-P ...
- HDU 4816 Bathysphere(数学)(2013 Asia Regional Changchun)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4816 Problem Description The Bathysphere is a spheric ...
- CCF真题之字符串匹配
201409-3 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行.你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符:当选项关闭时,表示同一 ...
- 02---Net基础加强
将普通日期格式:“2014年7月8日”转换成汉字日期格式:“二零一四年七月八日”.(暂时不考虑10日,13日,23日) class Program { static void Main(string[ ...
- ThinkPHP讲解(五)——数据库配置及Model数据模型层、查询
数据库配置 在TP框架中要进行连接数据库操作,要进行配置 要在convertion.php中找到“数据库配置”,并复制到项目配置文件config.php中 Model模型层制作 model:数据库中每 ...
- 记linux下使用create_ap 创建热点失败及解决(涉及rfkill)
先介绍一下 create_ap. 这是一个在linux中创建热点用的脚本, 托管在github中, https://github.com/oblique/create_ap/ 正文开始: 习惯了win ...
- 搞笑的u盘图片
- struts2 笔记02 文件上传、文件下载、类型转换器、国际化的支持
Struts2的上传 1. Struts2默认采用了apache commons-fileupload 2. Struts2支持三种类型的上传组件 3. 需要引入commons-fileupload ...