#coding= utf-8
‘‘‘内部监控应用平台 自动化工作脚本 难点 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)) #运行结果 <class ‘list‘> print(len(infos)) #运行结果 11 data = [] for info in infos[1:]: #infos[1:]# print(type(info)) #<class ‘lxml.etree._Element‘> #谢主管 经典 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
原文:https://www.cnblogs.com/hawking21/p/10435928.html