'''内部监控应用平台 selenium自动化工作脚本'''

心得体会
1、没有难题,只有大小题,只有不会拆分难题、遇到大问题不断拆分为小问题
2、直接,面对目标网站去开发
3、环境配置,selenium获取源代码,离线文件写入到excel,智能等待功能,
4,模拟登陆,不需要,selenium已处理
5、存储为csv ,白做,客户不需要。
6、思路很重要,分页 如何获知几页?如何获知最后一页有几行?这个问题最后在首页汇总页,选择显示100行,客户数据在15-40行之间,这样直接对这一页解析存储excel,问题就解决了
7、其他办法解决,专用电脑的困难。只有客户电脑和专用网络才可以测试程序,我通常是等中午我不吃饭,或者客户下班后,我晚上加班再去开发,其余时间都是准备准备,很多时间浪费了。其实完全可以找刘飞帮忙协调一台老旧电脑给我开发程序测试。
8,技术方面,不稳定的稳定,就用try except去包含错误,重新点击。嵌套四重try模块。

难点
1,由于数据量过于庞大,每次查询翻页可能出错需要检查并且重新点击
2,网页的解析,id class等属性是动态变化的。使用xpath和css结合使用
3,涉及到selenium的点击,悬停,输入,截图,三层try块的容错处理
4,涉及到excel的循环写入,一个文件写11张表格,配合selenium截图验证

换selenium pip install selenium==3.8.0
C:\Users\admin>python
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32
Type “help”, “copyright”, “credits” or “license” for more information.

import selenium
说明没问题,安装成功
安装chromedriverC:\Windows\chromedriver\chromedriver.exe ok
windows 下,新建一个命名为chromedriver文件夹,将解压的chromedriver.exe放进文件夹,再配置进path环境变量 ok
驱动的下载地址如下:
http://chromedriver.storage.googleapis.com/index.html
ChromeDriver v2.40 (2018-06-07) Supports Chrome v66-68
ChromeDriver v2.39 (2018-05-30) Supports Chrome v66-68

# coding= utf-8
'''内部监控应用平台 自动化工作脚本'''
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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值