我最近写了一个Python程序,自动提取Excel数据,用Selenium统计Jiras数据,并写入Excel。
1.openPage
打开并登录Jira,打开需统计的jira的页面,页面的search文本框,输入查询条件,就是sql语句,在jira中,叫做 jql.
2.statistic
统计jira数据,并写入Excel。
从Excel读取要搜索的条件:读取这个 sheet :“JiraData”
读取jira页面的记录总数,写入 Excel的 sheet:Sum
遍历jira中的bug 表格,并写入Excel的各个 sheet。
# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
import Write_excel
wr = Write_excel.Write_excel('SasaiBugStatistic.xlsx')
sheetNames=['PaymentProduct','LiveProduct','OthersProduct','AllProduct','PaymentPreProduct','LivePreProduct','OthersPreProduct','AllPreProduct']
driver = webdriver.Chrome()
def openPage():
i = 2
driver.get("http://***:36808/login.jsp")
sleep(2)
el = driver.find_element(By.ID, "login-form-username")
el.send_keys("***")
el = driver.find_element(By.ID, "login-form-password")
el.send_keys("***")
el = driver.find_element(By.ID, "login-form-submit")
el.click()
sleep(5)
urlSearch = "http://202.104.66.150:36808/issues/?jql=project%20in%20(CUB%2C%20ANDROIDUAT%2C%20IOSUAT%2C%20ANDROIDPRO%2C%20BACKENDPRO%2C%20IOSPROD)%20AND%20status%20in%20(Open%2C%20%22To%20Do%22%2C%20Reopened)%20AND%20affectedVersion%20in%20(%222.9.17%20production%22%2C%20%222.9.18%20%20production%22%2C%20%222.9.18%20production%22%2C%20%222.9.19%20%20production%22%2C%20%222.9.19%20production%22%2C%20%222.9.20%20%20production%22%2C%20%222.9.20%20production%22%2C%20%222.9.21%20%20production%22%2C%20%222.9.21%20production%22%2C%20%222.9.22%20%20production%22%2C%20%222.9.22%20production%22%2C%20%222.9.23%20%20production%22%2C%20%222.9.23%20production%22%2C%20%222.9.24%20Production%22%2C%20%222.9.25%20Production%22%2C%20%222.9.26%20production%22%2C%20%222.9.27%20production%22%2C%20%222.9.28%20Production%22%2C%20%222.9.29%20Production%22%2C%20%222.9.30%20production%22)%20AND%20component%20in%20(%22EcoCash%20Wallet%20APP%22%2C%20Remittances%2C%20%22Sasai%20Wallet%20APP%22%2C%20%22Sasai%20Wallet%20Management%20portal%22%2C%20%22Sasai%20Wallet%20Merchant%20portal%22%2C%20Wallet)%20ORDER%20BY%20created%20ASC%2C%20status%20ASC%2C%20summary%20ASC%2C%20affectedVersion%20ASC"
driver.get(urlSearch)
def statistic():
row = 3
sheetIndex = 0
'''get jira page,search condition (jql)'''
searchs = wr.getExcelData("JiraData",2)
for search in searchs:
sleep(3)
condition = driver.find_element(By.ID,"advanced-search")
condition.clear()
sleep(2)
condition.send_keys(search)
button = driver.find_element(By.XPATH,'//*[@id="content"]/div[1]/div[4]/div/form/div[1]/div[1]/div[1]/div[2]/button')
button.click()
sleep(4)
total = driver.find_element(By.XPATH,"//*[@id=\"content\"]/div[1]/div[4]/div/div/div/div/div/div/div[1]/div[1]/div/div/span/span[3]")
print("total:" + total.text)
'''set excel, Sum sheet , total data'''
wr.setExcelData('Sum',row,4,total.text)
row=row+1
table = driver.find_element(By.ID,"issuetable")
#table的总行数,包含标题
table_rows = table.find_elements(By.TAG_NAME,"tr")
#tabler的总列数
table_cols = table_rows[0].find_elements(By.TAG_NAME,"th")
for i in range(1,len(table_rows)):
for j in range(0,len(table_cols)-1):
cell = table_rows.find_elements(By.TAG_NAME,"td")[j].text
wr.writeOnly(sheetNames[sheetIndex],i,j+1,cell)
# print("第"+str(i) +"行第"+str(j)+"列的text: "+ cell)
wr.save()
sheetIndex = sheetIndex + 1
'''main'''
openPage()
wr.clearSheet(sheetNames)
statistic()
操作Excel 的 类:
import requests
from openpyxl import load_workbook
from openpyxl import Workbook
# from openpyxl.chart import BarChart, Series, Reference, BarChart3D
# from openpyxl.styles import Color, Font, Alignment
# from openpyxl.styles.colors import BLUE, RED, GREEN, YELLOW
class Write_excel(object):
def __init__(self,filename):
self.filename = filename
self.wb = load_workbook(self.filename)
self.sheets = self.wb.sheetnames
self.ws = self.wb.active
def write(self, row,col, value):
self.ws.cell(row,col).value = value
self.wb.save(self.filename)
def merge(self, rangstring):
# eg: rangstring:A1:E1
self.ws.merge_cells(rangstring)
self.wb.save(self.filename)
def cellstyle(self, coord, font, align):
cell = self.ws.cell(coord)
cell.font = font
cell.alignment = align
def writeOnly(self,sheetName, row,col, value):
sheet = self.wb.get_sheet_by_name(sheetName)
sheet.cell(row,col).value = value
def save(self):
self.wb.save(self.filename)
def clearSheet(self,sheetNames):
for i in range(3, 11):
index = i-3
sheet = self.wb.get_sheet_by_name(sheetNames[index])
sheet.delete_cols(1, 9)
self.wb.save(self.filename)
def makechart(self, title, pos, width, height, col1, row1, col2, row2, col3, row3, row4):
''':param title:图表名
pos:图表位置
width:图表宽度
height:图表高度
'''
data = Reference(self.ws, min_col=col1, min_row=row1, max_col=col2, max_row=row2)
cat = Reference(self.ws, min_col=col3, min_row=row3, max_row=row4)
chart = BarChart3D()
chart.title = title
chart.width = width
chart.height = height
chart.add_data(data=data, titles_from_data=True)
chart.set_categories(cat)
self.ws.add_chart(chart, pos)
self.wb.save(self.filename)
def callAPI(self,id,method,url, params,i):
# url = "https://www.baidu.com/s"
# params = {'wd': '早上好'} # 该字典键值对的形式可以通过form data中查询
headers = {
"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Mobile Safari/537.36"
}
if (method=='get'):
res = requests.get(url, params=params, headers=headers)
elif(method=='post'):
res = requests.post(url, data=params, headers=headers)
if res.status_code == 200:
self.write(i, 6, 'passed')
print(str(id) +' . ' + url + ": Test passed")
else:
self.write(i, 6, 'failed')
print(str(id) +' . ' + url + ": Test failed")
def getExcelData(self,sheetName,col):
# 获取最大行数 self.ws.max_row
sheet = self.wb.get_sheet_by_name(sheetName)
cells = []
for i in range(1,sheet.max_row+1):
cell = sheet.cell(i, col).value
cells.append(cell)
# print(cells)
return cells
def setExcelData(self,sheetName,row,col,value):
# 获取最大行数 self.ws.max_row
sheet = self.wb.get_sheet_by_name(sheetName)
sheet.cell(row,col).value = value
self.wb.save(self.filename)