'''内部监控应用平台 自动化工作脚本
难点
1,由于数据量过于庞大,每次查询翻页可能出错需要检查并且重新点击
2,网页的解析,id class等属性是动态变化的。使用xpath和css结合使用
3,涉及到selenium的点击,悬停,输入,截图,三层try块的容错处理
4,涉及到excel的循环写入,一个文件写11张表格,配合selen'''
from time import sleep
import xlrd, xlwt,os, datetime
from lxml import etree
from xlutils.copy import copy as xl_copy #使用python在excel表格中增加新的sheet表
from selenium import webdriver# 导入网页的驱动类
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys #就可以模拟键盘操作了
from selenium.webdriver.support.ui import WebDriverWait #依旧失败,截图还是未更新完成的 去掉再测试
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
from selenium.common.exceptions import NoSuchElementException,TimeoutException
def write_err_page(html,filepath):
'''把错误码详情页面写入到excel文件,新增表单'''
selector = etree.HTML(html)
infos = selector.xpath("//table[@id='dataGrid']//tr")
data = []
for info in infos: # infos[1:]
cuowumas = info.xpath('td[5]/text()') #出来10行的交易吗名字
suoshus = info.xpath('td[4]/text()') # '错误所属逻辑系统'
jiaoyiliangs = info.xpath('td[6]/text()')
yewulvs = info.xpath('td[7]/text()')
xitonglvs = info.xpath('td[8]/text()')
Time_xiangyings = info.xpath('td[9]/text()')
Time_chulis = info.xpath('td[10]/text()')
changliangs = info.xpath('td[11]/text()')
changlvs = info.xpath('td[15]/text()')
APDEXs = info.xpath('td[16]/text()')
# print(cuowumas,jiaoyiliangs,yewulvs,xitonglvs,Time_xiangyings,Time_chulis,changliangs,changlvs,APDEXs)
for cuowuma,suoshu,jiaoyiliang,yewulv,xitonglv,Time_xiangying,Time_chuli,changliang,changlv,APDEX in zip(cuowumas,suoshus,jiaoyiliangs,yewulvs,xitonglvs, Time_xiangyings,Time_chulis,changliangs,changlvs,APDEXs):
aa = {
'错误码':cuowuma,
'错误所属逻辑系统':suoshu,
'交易量':jiaoyiliang,
'业务成功率':yewulv,
'系统成功率':xitonglv,
'平均响应时间':Time_xiangying,
'平均处理时长':Time_chuli,
'长交易量':changliang,
'长交易率':changlv,
'APDEX':APDEX,
}
data.append(aa)
excelPath = os.path.join(filepath + os.sep + '0应用监控.xls')
book_rb = xlrd.open_workbook(excelPath) #打开监控存储文件
book = xl_copy(book_rb) #xlutils.copy 复制功能,使用python在excel表格中增加新sheet表
sheet_name = selector.xpath("//*[@id='tabs']/ul/li[3]/a/text()")#定位错误码对应名称
sheet_name = sheet_name[0][5:].replace('[','').replace(']','').replace('/','').replace('\\','')
#[5:] 是把‘错误码视图’ 5个字去除,.replace('[','')是因为[]不允许出现在表单命名中
print("表单名称:"+ sheet_name)
try:
sheet = book.add_sheet(sheet_name)
except:
sheet = book.add_sheet("sheet命名出错")
print("excel的sheet表名命名出错请检查--------------异常------")
headers = [k for k in data[0]]# print('>> 标题数据集headers:{0}'.format(headers))
contents = [[v for v in item.values()] for item in data]# print('>> contents:{0}'.format(contents)) # 内容数据集(嵌套list结构 [[1,2,3],[4,5,6],[6,7,8]])
for colIndex in range(len(headers)):# 使用循环将标题headers写入excel第1行(rowIndex = 0)
sheet.write(0, colIndex, headers[colIndex])
for rowIndex in range(1, len(contents)+1):# 步骤5-1:外层for循环控制行数
for colIndex in range(len(headers)):# 步骤5-2:内层for循环控制列数
# 步骤5-3:写入内容数据
sheet.write(rowIndex, colIndex, contents[rowIndex-1][colIndex])
book.save(excelPath)
print('写入错误码表单ok')
def write_main_page(html,filepath):
'''把交易码汇总页面 写入到excel,顺序不稳定版本,需修改成上面的模式'''
selector = etree.HTML(html) #etree.HTML(源码) 识别为可被xpath解析的对象
infos = selector.xpath('//table[@id="dataGrid"]//tr') #取大块内容,尾部啥都不需要,去掉tbody才可以。print(type(infos)) #运行结果
print(len(infos)) #运行结果 11
data = []
for info in infos[1:]: #infos[1:]# print(type(info)) #
#谢主管 经典 xpat测试成功 : "//*[@id='dataGrid']//*[@class='jqgfirstrow'][1]/../tr[2]/td[2]" 取代了动态id定位
jiaoyimas = info.xpath('td[2]/text()') #出来10行的交易吗名字
jiaoyiliangs = info.xpath('td[5]/text()')
yewulvs = info.xpath('td[6]/text()')
xitonglvs = info.xpath('td[7]/text()')
Time_xiangyings = info.xpath('td[8]/text()')
Time_chulis = info.xpath('td[9]/text()')
changliangs = info.xpath('td[10]/text()')
changlvs = info.xpath('td[14]/text()')
APDEXs = info.xpath('td[15]/text()')
# print(jiaoyima,jiaoyiliang,yewulv,xitonglv,Time_xiangying,Time_chuli,changliang,changlv,APDEX)
for jiaoyima,jiaoyiliang,yewulv,xitonglv,Time_xiangying,Time_chuli,changliang,changlv,APDEX in zip(jiaoyimas,jiaoyiliangs,yewulvs,xitonglvs, Time_xiangyings,Time_chulis,changliangs,changlvs,APDEXs):
aa = {
'交易码':jiaoyima,
'交易量':jiaoyiliang,
'业务成功率':yewulv,
'系统成功率':xitonglv,
'平均响应时间':Time_xiangying,
'平均处理时长':Time_chuli,
'长交易量':changliang,
'长交易率':changlv,
'APDEX':APDEX,
}
data.append(aa)
book = xlwt.Workbook(encoding='utf-8')
sheet = book.add_sheet('交易码汇总页100行内')
headers = [k for k in data[0]]
# print('>> 标题数据集headers:{0}'.format(headers))
contents = [[v for v in item.values()] for item in data]
# print('>> contents:{0}'.format(contents)) # 内容数据集(嵌套list结构 [[1,2,3],[4,5,6],[6,7,8]])
for colIndex in range(len(headers)):# 使用循环将标题headers写入excel第1行(rowIndex = 0)
sheet.write(0, colIndex, headers[colIndex])
for rowIndex in range(1, len(contents)+1):# 步骤5-1:外层for循环控制行数
for colIndex in range(len(headers)):# 步骤5-2:内层for循环控制列数
# 步骤5-3:写入内容数据
sheet.write(rowIndex, colIndex, contents[rowIndex-1][colIndex])
book.save(filepath + os.sep + '0应用监控.xls')
print('写入交易码汇总数据(100条内有效)ok')
def wending(locate):
'''稳定函数,如;果页面数据不出现再次点击一次 定位表格第二行第二个元素'''
'''locate: 类型为str,是指定位置的css解析代码,检查这里有没有出现'''
wait = WebDriverWait(driver,80)# locate="#dataGrid > tbody > tr:nth-child(3) > td:nth-child(2)"#定位表格类元素第二行第二个元素
sleep(2)
obj_chaxun = driver.find_element_by_xpath("//*[@id='btnSchName']/i")
try :
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,locate)))
except TimeoutException:
obj_chaxun.click() ##查询按钮再次点击
print("页面不加载,超时报错,开始点击第2次---------页面不加载--------------------")
try :
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,locate)))
except TimeoutException:
obj_chaxun.click() ##查询按钮再次点击
print("页面不加载,超时报错,执行查询点击第3次--------页面不加载---------------------")
try :
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,locate)))
except TimeoutException:
obj_chaxun.click() ##查询按钮再次点击
print("页面不加载,超时报错,执行查询点击第4次--------页面不加载---------------------")
except NoSuchElementException:
obj_chaxun.click() ##查询按钮再次点击
print("NoSuchElementException,执行查询点击第一次---------页面不加载--------------------")
# finally:
# wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,locator_form22)))
def get_main_page():
'''获取交易码首页数据,截图并存excel'''
# wait = WebDriverWait(driver,80)
elem_zhanghao = driver.find_element_by_xpath("//*[@id='Content']/div[3]/div[4]/input[1]")
elem_zhanghao.send_keys("xuchangshan.zh")
elem_password = driver.find_element_by_xpath("//*[@id='Content']/div[3]/div[4]/input[2]")
elem_password.send_keys("password5")
elem_denglu = driver.find_element_by_xpath("//*[@id='BtnLogin']")
elem_denglu.click()
sleep(2)
#登陆,点击交易监控
obj1 = driver.find_element_by_xpath("//*[@id='page_container_id']/div[1]/ul/li[2]/a")
obj1.click()
driver.maximize_window()
#下面,点击表格视图
obj2 = driver.find_element_by_xpath("//*[@id='li_tranView']/a")
obj2.click()
sleep(1)
# 遇到问题卡住,需要切换到 iframe id = "iframe-content-id"
driver.switch_to.frame('iframe-content-id')
obj3 = wait.until(EC.presence_of_element_located((By.ID,"appNameRef")))
sleep(2)
obj3.send_keys("P12N-EDTM")
# driver.find_element_by_xpath("//*[@id='btnSchName']/i").click() #系统确实不稳定 点击搜索出现空白,需要点击 实时刷新
obj31 = driver.find_element_by_css_selector("#refreshTimeTd > #refreshTime")
obj31.click()
obj4 = wait.until(EC.presence_of_element_located((By.XPATH,"//*[@id='1532']/td[2]")))
obj4.click()#obj4这里智能等待有效
#出现一级菜单 ,下面需要选中视图钻取 + 鼠标悬停
above = driver.find_element_by_css_selector("#menu > li:nth-child(1)")
ActionChains(driver).move_to_element(above).perform() #鼠标悬停
#出现二级菜单 选中交易码视图单击
obj5 = driver.find_element_by_xpath("//*[@id='ui-id-9']") #menu > li:nth-child(1)
obj5.click()
sleep(1)
#选中 更多操作右边的小三角 单击小三角
obj6 = driver.find_element_by_xpath("//*[@id='moreCorBtn']/div/div[3]/button[2]")
obj6.click()
#选中 历史汇总 单击
obj7 = driver.find_element_by_xpath("//*[@id='hisStatTd']/span")
obj7.click()
sleep(1)
#选中 起始日期输入框
obj8 = driver.find_element_by_xpath("//*[@id='hisStatFrom']")
obj8.clear() # obj8.send_keys(Keys.CONTROL,'x') 确定不可代替清空
obj8.send_keys(yesterday0000)
#选中 截止日期输入框
obj9 = driver.find_element_by_xpath("//*[@id='hisStatTo']")
obj9.clear()
obj9.send_keys(yesterday2359)
obj100 = driver.find_element(By.CSS_SELECTOR,"#tablePager_center > table > tbody > tr > td:nth-child(8) > select > option:nth-child(4)")
obj100.click() #控制选择100行
obj_chaxun = driver.find_element_by_xpath("//*[@id='btnSchName']/i") #定位查询按钮
obj_chaxun.click()#定位查询按钮
locate="#dataGrid > tbody > tr:nth-child(3) > td:nth-child(2)"#定位表格类元素第二行第二个元素
wending(locate)
sleep(80)#还没更新到100行的数据出现,已经进行截图,点击错误ma
driver.get_screenshot_as_file(filepath + os.sep + "00汇总页1-15.png") #存储第一页汇总
print("00汇总页1-15,截图成功")
html=driver.page_source
write_main_page(html,filepath) #主页写入到excel
def get_err_page():
'''获取错误视图码数据,并存储excel'''
for i in range(1,100):
if i>10:
obj100 = driver.find_element(By.CSS_SELECTOR,"#tablePager_center > table > tbody > tr > td:nth-child(8) > select > option:nth-child(4)")
obj100.click()#点击选择显示100行
locate="#dataGrid > tbody > tr:nth-child(3) > td:nth-child(2)"#定位表格类元素第二行第二个元素
wending(locate) # sleep(60) #这个sleep半夜12点很稳定就是不够快
else:
pass
locate = "#dataGrid > tbody > tr:nth-child(" + str(i+1) + ") > td:nth-child(2)"#表格内22
wending(locate) #定位交易码汇总表格内容
obj14 = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,locate)))
obj14.click()
print("查询结果页,点击行,出现一级菜单")
#出现一级菜单 ,下面选中视图钻取 悬停
obj15 = wait.until(EC.presence_of_element_located((By.XPATH,"//*[@id='body']//*[@id='menu']//li[1]/a")))
ActionChains(driver).move_to_element(obj15).perform() #鼠标悬停ok 不可以偷懒,'' 包含""是错误的
print("查询结果页, 悬停, 出现二级菜单")
#选择二级菜单-错误码视图,点击
sleep(1)
obj16 = driver.find_element_by_css_selector("#menu > li:nth-child(1) > ul > li:nth-child(7) > a") #定位成功,又失败5次
obj16.click() # Message: element not visibl
print("点击二级菜单错误码成功")
locate="#dataGrid > tbody > tr:nth-child(2) > td:nth-child(2)" #错误码详情页 定位表格内元素
wending(locate)
js_top = "var q=document.documentElement.scrollTop=0"
driver.execute_script(js_top) #滚动到顶部
driver.switch_to.default_content() #切出frame框架
# driver.execute_script("document.getElementsByClassName('select')[0].scrollIntoView(true);")#f12测试有效,滚动到可见位置 此处失败1次 Id('tabs' 是总览视图 唯一id 测试2次无效一定要具体元素才行,xxx select--------------------------------
driver.execute_script("window.scrollTo(0,0);")#滚动到顶部
# driver.execute_script("var q=document.documentElement.scrollTop=0")------#滚动到顶部-注释试试。
filename = "错误码视图0" + str(i) + "项.png"
driver.get_screenshot_as_file(filepath + os.sep + filename )
print("错误码截图,成功第%d张"%(i))
driver.switch_to.frame('iframe-content-id')
html=driver.page_source
write_err_page(html,filepath)
#回首页 点击顶部 交易码视图(外部数据管理[P12N-EDTM]) css解析网页验证通过,之前都可以的
obj17 = driver.find_element_by_css_selector("#body > div.page-container > div > div:nth-child(1) > div > div > ul > li:nth-child(2)")
obj17.click()
# locate="#dataGrid > tbody > tr:nth-child(3) > td:nth-child(2)"#汇总页定位表格元素第二行第二个元素
# wending(locate)#稳定回到主页目录页,老出错奔溃
sleep(60)
print("返回首页成功")
if __name__ == '__main__':
url='http://11.168.30.11:1380/appmon-web/index.jsp' #建行应用监控平台,外部数据项目
driver = webdriver.Chrome()#返回一个驱动对象,模拟用户的操作行为
wait = WebDriverWait(driver,80)
start_time = (datetime.datetime.now() - datetime.timedelta(days=1)).strftime('%Y-%m-%d %H%M') #获取当前日期
yesterday0000 = start_time.split(" ",1)[0] + ' 00:00'
yesterday2359 = start_time.split(" ",1)[0] + ' 23:59'
filepath = os.path.join(os.getcwd(), start_time) #os.path.join(os.getcwd(), '监控错误码.xls')
if not os.path.exists(filepath):
os.mkdir(filepath)
driver.get(url)
get_main_page()#汇总页截图并存储excel
get_err_page()#错误码 截图并存储excel