在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过滤器视图的统计自动化的更多相关文章

  1. Django编写RESTful API(三):基于类的视图

    欢迎访问我的个人网站:www.comingnext.cn 前言 在上一篇文章中,主要讲的是请求和响应,项目里面views.py中的视图函数都是基于函数的,并且我们介绍了@api_view这个很有用的装 ...

  2. Django REST FrameWork中文教程3:基于类的视图

    我们也可以使用基于类的视图编写我们的API视图,而不是基于函数的视图.我们将看到这是一个强大的模式,允许我们重用常用功能,并帮助我们保持代码DRY. 使用基于类的视图重写我们的API 我们将首先将根视 ...

  3. django-rest-framework之基于类的视图

    前言:上一篇博客中,主要讲的是请求和响应,项目里面views.py中的视图函数都是基于函数的,并且我们介绍了@api_view这个很有用的装饰器.同时,我们还介绍了APIView这个类,但是还没使用它 ...

  4. django 中基于类的视图

    django 视图 分为两种: 1.  FBV  基于函数的视图      function   based  view 2.  CBV  基于类的视图         class   based  ...

  5. 介绍——基于类的视图(class-based view)

    ​刚开始的时候,django只有基于函数的视图(Function-based views).为了解决开发视图中繁杂的重复代码,基于函数的通用视图( Class-based generic views) ...

  6. Django 基于类的视图(CBV)执行流程 CBV 源码分析

    一.CBV(基于类的视图) 视图是可以调用的,它接受请求并返回响应,这不仅仅是一个函数,Django提供了一些可以用作视图的类的例子,这些允许您通过继承或mixin来构建视图并重用代码. 基本示例 D ...

  7. Django——基于类的视图源码分析 一

    基于类的视图(Class-based view)是Django 1.3引入的新的视图编写方式,用于取代以前基于函数(Function-based)方式. 借助于OO和Python中方便的多重继承特性, ...

  8. Django——基于类的视图源码分析 二

    源码分析 抽象类和常用视图(base.py) 这个文件包含视图的顶级抽象类(View),基于模板的工具类(TemplateResponseMixin),模板视图(TemplateView)和重定向视图 ...

  9. Django——基于类的视图(class-based view)

    刚开始的时候,django只有基于函数的视图(Function-based views).为了解决开发视图中繁杂的重复代码,基于函数的通用视图( Funcation-based generic vie ...

随机推荐

  1. WebService的简单应用

    具体看项目源文件:包含: ip地址查询, QQ在线状态查询,和自定义的MD5 破解和加密(呵呵有形无势...) http://pan.baidu.com/s/1bn09WQj SOAP 1.1 The ...

  2. .net 反编译工具

    遇到一个需求,做一个专门访问自己网站的浏览器给用户使用,这个浏览器提供登录功能.此时是一个安装在客户端的exe程序,做登录验证要用到webservice,不能将验证逻辑写入exe中,否则客户端可以利用 ...

  3. struts_22_xwork校验器列表使用说明

    系统提供的校验器列表如下: required (必填校验器,要求field的值不能为null) requiredstring (必填字符串校验器,要求field的值不能为null,并且长度大于0,默认 ...

  4. App架构设计学习(一)---- 接口的设计

    一.哎,最近换了家工作,结果工作很出的我意外,没有干熟悉的根据需求写代码,反而让我一个小菜鸟去重构一下App的架构(他们公司的app,已经上线了1.0版本了),没办法,只有硬着头皮去先学习学习,再总结 ...

  5. paper 38 :entropy

    图像熵计算 真是为了一个简单的基础概念弄的心力交瘁,请教了一下师姐,但是并没有真的理解,师弟我太笨呀~~所以,我又查熵的中文含义和相关的出处!共勉吧~~ 1.信息熵: 利用信息论中信息熵概念,求出任意 ...

  6. linux系统-代码行数计算

    find macc-cometd -type f -name "*.java" -print0 | xargs -0 wc -l

  7. Power Gating的设计(概述)

    Leakage power随着CMOS电路工艺进程,功耗越来越大. Power Domain的开关一般通过硬件中的timer和系统层次的功耗管理软件来进行控制,需要在一下几方面做trade-off: ...

  8. 台电幻彩u盘拆解

  9. 【py网页】urllib.urlretrieve远程下载

    下面我们再来看看 urllib 模块提供的 urlretrieve() 函数.urlretrieve() 方法直接将远程数据下载到本地. 1 >>> help(urllib.urlr ...

  10. 详解Android AM命令

    1.简介 在Android中,我们除了从界面上启动程序之外,还可以从命令行启动程序,如使用命令行工具am. am全称activity manager,是Android下非常实用命令,其代码在frame ...