zoukankan      html  css  js  c++  java
  • 混合式自动化测试框架

    框架结构:

    get地址:https://github.com/zihui1/selenium3-python3

    actionb包中的PageAction主要封装常用的元素操作方式

    # encoding = utf-8
    from selenium import webdriver
    from util.ObjectMap import getElement
    from util.WaitUtil import WaitUtil
    from util.KeyBoardUtil import KeyboardKeys
    from util.ClipboardUtil import Clipboard
    from util.DirAndTime import *
    from config.VarConfig import ieDriverFilePath,chromeDriverFilePath,firefoxDriverFilePath
    import time
    
    # 定义全局driver变量
    driver = None
    # 全局的等待类实例对象
    waitUtil = None
    
    def open_browser(browserName,*args):
        global driver,waitUtil
        try:
            if browserName.lower() =="ie":
                driver = webdriver.Ie(executable_path=ieDriverFilePath)
            elif  browserName.lower() =="chrome":
                driver = webdriver.Chrome()
            elif browserName.lower() =="firefox":
                driver = webdriver.Firefox(executable_path=firefoxDriverFilePath)
            waitUtil = WaitUtil(driver)
        except Exception as e:
            raise e
    
    def visit_url(url,*args):
        # 访问某个网址
        global driver
        try:
            driver.get(url)
        except Exception as e:
            raise e
    
    def close_browser(*args):
        # 关闭浏览器
        global driver
        try:
            driver.quit()
        except Exception as e:
            raise e
    
    def sleep(sleepSeconds,*args):
        # 强制等待
        try:
            time.sleep(int(sleepSeconds))
        except Exception as e:
            raise e
    
    def clear(locationType,locatorExpression,*args):
        # 清楚输入框默认内容
        global driver
        try:
            getElement(driver,locationType,locatorExpression).clear()
        except Exception as e:
            raise e
    
    def input_string(locationType,locatorExpression,inputContent):
        # 在输入框中输入内容
        global driver
        try:
            if inputContent:
                getElement(driver,locationType,locatorExpression).send_keys(inputContent)
        except Exception as e:
            raise e
    def refresh(*args):
        # 刷新当前页面
        global driver
        try:
            driver.refresh()
        except Exception as e:
            raise e
    
    def click(LocationType,locatorExpression,*args):
        # 单击页面元素
        global driver
        try:
            getElement(driver,LocationType,locatorExpression).click()
        except Exception as e:
            raise e
    
    def Drop_down_box(assertString = None,*args):
        # 选择ul类型的下拉框
        global driver
        try:
            if assertString:
                getElement(driver,"xpath",'//li[text()="'+assertString+'"]').click()
        except Exception as e:
            raise e
    
    def assert_string_in_pagesource(assertString,*args):
        # 断言页面源码是否存在关键字或关键字符串
        global driver
        try:
            assert assertString in driver.page_source,
            u'%s :源码中找不到该关键字!'%(assertString)
        except AssertionError as e:
            raise AssertionError(e)
        except Exception as e:
            raise e
    
    def assert_title(titleStr,*args):
        # 断言页面标题是否存在给定的关键字符串
        global driver
        try:
            assert titleStr in driver.title,
            u"%s :title找不到!" %(titleStr)
    
        except AssertionError as e:
            raise AssertionError(e)
        except Exception as e:
            raise e
    
    def getTitle(*args):
        # 获取页面标题
        global driver
        try:
            return driver.title
        except Exception as e:
            raise e
    
    def getPageSource(*args):
        # 获取页面源码
        global driver
        try:
            return driver.page_source
        except Exception as e:
            raise e
    
    def switch_to_js(locationType,*args):
        #使用js对页面进行操作
        global driver
        try:
            return driver.execute_script(locationType)
        except Exception as e:
            raise e
    
    
    def switch_to_frame(locationType,frameLocatorExpression,*args):
        # 切换进入frame
        global driver
        try:
            driver.switch.to.frame(getElement(driver,locationType,frameLocatorExpression))
        except Exception as e:
            print("frame异常")
            raise e
    
    def switch_to_default_content(*args):
        # 切出frame
        global driver
        try:
            driver.switch_to.default_content()
        except Exception as e:
            raise e
    
    def paste_string(pasteString,*args):
        # 模拟键盘复制
        try:
            Clipboard.setText(pasteString)
            time.sleep(2)
            KeyboardKeys.twoKeys('ctrl','v')
        except Exception as e:
            raise e
    
    def press_tab_key(*args):
        # 模拟键盘tab
        try:
            KeyboardKeys.oneKey('tab')
        except Exception as e:
            raise e
    
    def press_enter_key(*args):
        # 模拟键盘Enter
        try:
            KeyboardKeys.oneKey("enter")
        except Exception as e:
            raise e
    
    def maximize_browser():
        # 窗口最大化
        global driver
        try:
            driver.maximize_window()
        except Exception as e:
            raise e
    
    def capture_screen(*args):
        # 截取屏幕图片
        global driver
        currTime = getCurrentTime()
        picNameAndPath= str(createCurrentDateDir())+"\"+str(currTime)+".png"
        try:
            driver.get_screenshot_as_file(picNameAndPath.replace('\',r'\'))
        except Exception as e:
            raise e
        else:
            return picNameAndPath
    
    
    def waitPresenceOfElementLocated(locationType,locatorExpression,*args):
        '''显示等待页面元素出现在Dom中,但并不一定可见,存在则返回该页面元素对象'''
        global waitUtil
        try:
            waitUtil.presenceOfElementLocated(locationType,locatorExpression)
        except Exception as e:
            raise e
    
    def waitFrameToBeAvailableAndSwitchToIt(locationType,locatorExpression,*args):
        '''检查frame是否存在,存在则切换进frame控件中'''
        global waitUtil
        try:
            waitUtil.frameToBeAvailaBleSwitchToIt(locationType,locatorExpression)
        except Exception as e:
            raise e
    
    def waitVisibilityOfElementLocated(locationType,locatorExpression,*args):
        '''显示等待页面元素出现在DOM中,并且可见,存在返回该页面元素对象'''
        global waitUtil
        try:
            waitUtil.visibilityOfElementLocated(locationType,locatorExpression,*args)
        except Exception as e:
            raise e
    

      config包中VarConfig主要放项目路径

    # encoding = utf-8
    import os
    
    
    # 各浏览器wendriver地址
    ieDriverFilePath = "c:\"
    chromeDriverFilePath = "c:\"
    firefoxDriverFilePath = "c:\"
    
    # 获取当前父级绝对路径
    parentDirPath = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    LogPath = parentDirPath+u"\Log\"
    
    # 异常截图存放目录绝对路径
    screePicturesDir = parentDirPath + u'\exceptionpictures\'
    
    # 存放数据文件存放绝对路径
    dataFilePath = parentDirPath+u'\testData\登录上海监管平台.xlsx'
    
    # 测试数据文件中,测试用例表中部分列对应的数字序号
    testCase_testCaseName =2
    testCase_frameWorkName = 4
    testCase_testStepSheetName =5
    testCase_dataSourceSheetName = 6
    testCase_isExecute =7
    testCase_runTime =8
    testCase_testResult = 9
    
    # 用例步骤表中,部分列对应的数字序号
    testStep_testStepDescribe = 2
    testStep_keyWords = 3
    testStep_locationType = 4
    testStep_locatorExpression = 5
    testStep_operatValue = 6
    testStep_runTime = 7
    testStep_testResult = 8
    testStep_errorInfo = 9
    testStep_errorPic = 10
    
    
    # 数据源表中,是否执行列对应的数字编号
    dataSource_isExecute = 13
    dataSource_name = 2
    dataSource_runTime = 14
    dataSource_result = 16
    

      exceptionpictures中主要是放异常截图信息

      Log包下放的是Log信息

      testData放的是测试用例

      testScripts放的是测试脚本

      __init__中引入通用的类

    #encoding = utf-8
    from action.PageAction import *
    from util.ParseExcel import ParseExcel
    from config.VarConfig import *
    from util.Log import Log
    import time
    import traceback
    
    # 创建解析Excel对象
    excelObj = ParseExcel()
    # 将Excel数据文件加载到内存
    excelObj.loadWorkBook(dataFilePath)
    log = Log()
    

      CreateContacts是数据驱动框架的逻辑

     

    #encoding = utf-8
    from . import *
    from testScripts.WriteTestResult import writeTestResult
    
    def dataDriverFun(dataSourceSheetObj,stepSheetObj):
        try:
            # 获取数据源表中是否执行列对象
            dataIsExecuteColumn = excelObj.getColumn(
                dataSourceSheetObj,dataSource_isExecute)
            # 获取数据源表中“姓名”列对象
            nameColumn = excelObj.getColumn(dataSourceSheetObj,dataSource_name)
            # 获取测试步骤表中存在数据区域的行数
            stepRowNums = excelObj.getRowsNumber(stepSheetObj)
            # 记录成功执行的数据条数
            successDatas = 0
            # 记录被设置为执行的数据条数
            requiredDatas = 0
            for idx,data in enumerate(dataIsExecuteColumn[1:]):
                # 遍历数据源表,准备进行数据驱动测试
                # 因为第一行是标题行,所以从第二行开始遍历
                if data.value == "y":
                    log.info(u'开始添加监管人员%s'%(nameColumn[idx+1].value))
                    requiredDatas +=1
                    # 定义记录执行成功步骤数变量
                    successStep = 0
                    for index in range(2,stepRowNums+1):
                        # 获取数据驱动测试步骤表中第index行对象
                        rowObj = excelObj.getRow(stepSheetObj,index)
                        # 获取关键字作为调用的函数名
                        keyWord = rowObj[testStep_keyWords -1].value
                        # 获取操作元素的定位表达式作为调用函数的参数
                        locationType = rowObj[testStep_locationType -1].value
                        # 获取操作元素的定位表达式作为调用的函数的参数
                        locatorExpression = rowObj[testStep_locatorExpression -1].value
                        # 获取操作值作为调用函数的参数
                        operateValue = rowObj[testStep_operatValue -1].value
                        if isinstance(operateValue,int):
                            operateValue = str(operateValue)
                        if operateValue and operateValue.isalpha():
                            # 如果operateValue变量不为空,说明有操作值从数据源表中
                            # 根据坐标获取对应单元格的数据
                            coordinate = operateValue+str(idx+2)
                            operateValue = excelObj.getCellOfValue(dataSourceSheetObj,
                                                                   coordinate=coordinate)
                            if isinstance(operateValue, int):
                                operateValue = str(operateValue)
                            # 构造需要执行的python表达式,此表达式对应的是PageAction.py文件
                            # 中的页面动作函数调用的字符串表示
                        tmpStr = "'%s','%s'"%(locationType.lower(),locatorExpression.replace(
                                "'",'"'))if locationType and locatorExpression else""
                        if tmpStr:
                            tmpStr+=
                            ",u'"+operateValue+"'" if operateValue else ""
                        else:
                            tmpStr +=
                            "u'"+operateValue+"'" if operateValue else ""
                        runStr = keyWord+"("+tmpStr+")"
                        print(runStr)
                        try:
                                eval(runStr)
                        except Exception as e:
                            log.error(u'执行步骤%s发生异常'%rowObj[testStep_testStepDescribe-1].value)
                            log.error(traceback.print_exc())
                            # # 截取异常屏幕图片
                            # capturePic = capture_screen()
                            # # 获取详细的异常堆栈信息
                            # errorInfo = traceback.format_exc()
                            # writeTestResult(stepSheetObj, rowNo=index, 
                            #                 colsNo="caseStep", testResult="faild", 
                            #                 errorInfo=str(errorInfo), picPath=capturePic)
                        else:
                            successStep+=1
                            log.info(u'执行步骤%s成功'%rowObj[testStep_testStepDescribe-1].value)
                    if stepRowNums == successStep+1:
                        successDatas+=1
                        # 如果成功执行的步骤数等于步骤表中给出的步骤数
                        # 说明第idx+2行的数据执行通过,写入通过信息
                        writeTestResult(dataSourceSheetObj,rowNo=idx+2,colsNo="dataSheet",
                                            testResult="pass")
                    else:
                        # 写入失败信息
                        writeTestResult(dataSourceSheetObj,rowNo=idx+2,colsNo="dataSheet",
                                            testResult="faild")
                else:
                    # 将不需要执行的数据行的执行时间和执行结果单元格清空
                    writeTestResult(dataSourceSheetObj,rowNo=idx+2,colsNo="dataSheet",
                                    testResult="")
            if requiredDatas == successDatas:
                # 只要当成功执行的数据条数等于被设置为需要执行的数据条数,
                # 才表示调用数据驱动的测试用例执行通过
                return 1
            # 表示调用数据驱动的测试用例执行失败
            return None
        except Exception as e:
            raise e
    

      WriteTestResult放入写入测试用例的格式和引入位置信息

    #encoding = utf-8
    from . import *
    
    
    # 用例或用例步骤执行结束后,向Excel中写执行结果信息
    def writeTestResult(sheetObj,rowNo,colsNo,testResult,
                        errorInfo = None,picPath = None):
        # 测试通过结果信息为绿色,失败为红色
        colorDict = {"pass":"green","faild":"read","":None}
    
        # 因为“测试用例”工作表和“用例不走Sheet表”中都有测试执行时间和测试
        # 结果列,定义此字典对象是为了区分具体应该写那个工作表
        colsDict = {
            "testCase":[testCase_runTime,testCase_testResult],
            "caseStep":[testStep_runTime,testStep_testResult],
            "dataSheet":[dataSource_runTime,dataSource_result]}
        try:
            # 在测试步骤sheet中,写入测试结果
            excelObj.writeCell(sheetObj,content=testResult,
                               rowNo=rowNo,colsNo=colsDict[colsNo][1],
                               style=colorDict[testResult])
            if testResult == "":
                # 清空时间单元格内容
                excelObj.writeCell(sheetObj,content="",
                                   rowNo= rowNo,colsNo= colsDict[colsNo][0])
            else:
                # 在测试步骤sheet中,写入测试时间
                excelObj.writeCellCurrentTime(sheetObj,rowNo=rowNo,colsNo=colsDict[colsNo][0])
            if errorInfo and picPath:
                # 在测试步骤sheet中,写入异常信息
                excelObj.writeCell(sheetObj,content=errorInfo,rowNo=rowNo,
                                   colsNo=testStep_errorInfo)
                # 在测试步骤sheet中,写入异常截图路径
                excelObj.writeCell(sheetObj,content=picPath,rowNo=rowNo,colsNo=testStep_errorPic)
            else:
                if colsNo=="caseStep":
                    # 在测试步骤sheet中,清空异常信息单元格
                    excelObj.writeCell(sheetObj,content="",rowNo=rowNo,colsNo=testStep_errorInfo)
                    excelObj.writeCell(sheetObj,content="",rowNo=rowNo,colsNo=testStep_errorPic)
        except Exception as e:
            log.error(u'写excel时发生异常'+traceback.print_exc())
            
    

      TestShNw放的执行测试步骤

    #encoding = utf-8
    from . import *
    from . import CreateContacts
    from testScripts.WriteTestResult import writeTestResult
    
    def TestShNw():
        try:
            # 根据Excel文件中的sheet名获取sheet对象
            caseSheet = excelObj.getSheetByName(u'测试用例')
            # 获取测试用例sheet中是否执行列对象
            isExecuteColumn = excelObj.getColumn(caseSheet,testCase_isExecute)
            # 记录执行成功的测试用例个数
            successfulCase = 0
            # 记录需要执行的用例个数
            requiredCase =0
            for idx,i in enumerate(isExecuteColumn[1:]):
                # 因为用例sheet中第一行为标题行,无须执行
                caseName = excelObj.getCellOfValue(caseSheet,rowNo=idx+2,
                                                   colsNo=testCase_testCaseName)
                # 循环遍历“测试用例”表中的测试用例,执行被设置为执行的用例
                if i.value.lower() == "y":
                    requiredCase +=1
                    # 获取测试用例表中,第idx+1行中
                    # 用例执行时所使用的框架类型
                    useFrameWorkName = excelObj.getCellOfValue(
                        caseSheet,rowNo=idx+2,colsNo=testCase_frameWorkName)
                    # 获取测试用例列中,第idx+1行中执行用例的步骤sheet名
                    stepSheetName = excelObj.getCellOfValue(
                        caseSheet,rowNo=idx+2,colsNo=testCase_testStepSheetName)
                    log.info('----------'+stepSheetName)
                    if useFrameWorkName == u'数据':
                        log.info(u'***********调用数据驱动************')
                        # 获取测试用例表中,第idx+1行,执行框架为数据驱动的用例所使用的数据sheet名
                        dataSheetName = excelObj.getCellOfValue(
                            caseSheet,rowNo=idx+2,colsNo=testCase_dataSourceSheetName)
                        # 获取第idx+1行测试用例的步骤sheet对象
                        stepSheetObj = excelObj.getSheetByName(stepSheetName)
                        # 获取第idx+1行测试用例使用的数据sheet对象
                        dataSheetObj = excelObj.getSheetByName(dataSheetName)
                        # 通过数据驱动框架执行添加联系人
                        result = CreateContacts.dataDriverFun(dataSheetObj,stepSheetObj)
                        if result:
                            log.info(u'用例%s执行成功'%(caseName))
                            successfulCase+=1
                            writeTestResult(caseSheet,rowNo=idx+2,
                                            colsNo="testCase",testResult="pass")
                        else:
                            log.info(u'用例%s执行失败'%(caseName))
                            writeTestResult(caseSheet,rowNo=idx+2,colsNo="testCase",testResult="faild")
                    elif useFrameWorkName == u"关键字":
                        log.info("*************调用关键字驱动****************")
                        caseStepObj = excelObj.getSheetByName(stepSheetName)
                        stepNums = excelObj.getRowsNumber(caseStepObj)
                        successfulSteps = 0
                        log.info(u'测试用例工%s步'%(stepNums))
                        for index in range(2,stepNums+1):
                            # 因为第一行标题行无须执行
                            # 获取步骤sheet中第index行对象
                            stepRow = excelObj.getRow(caseStepObj,index)
                            # 获取关键字作为调用的函数名
                            keyWord = stepRow[testStep_keyWords -1].value
                            # 获取操作元素定位方式作为调用的函数的参数
                            locationType = stepRow[testStep_locationType -1].value
                            # 获取操作元素的定位表达式作为调用函数的参数
                            locatorExpression = stepRow[testStep_locatorExpression -1].value
                            # 获取操作值为调用函数的参数
                            operateValue = stepRow[testStep_operatValue -1].value
                            if isinstance(operateValue,int):
                                # 如果operateValue值为数字型,
                                # 将其转换为字符串,方便字符串拼接
                                operateValue = str(operateValue)
                            # 构造需要执行的Python表达式,此表达式对应的是PageAction.py文件
                            # 中的页面动作函数调用的字符串表达式
                            tmpStr = "'%s','%s'"%(locationType.lower(),
                                                  locatorExpression.replace("'",'"')
                                                  )if locationType and locatorExpression else ""
                            if tmpStr:
                                tmpStr+=
                                ",u'"+operateValue+"'" if operateValue else ""
                            else:
                                tmpStr +=
                                "u'"+operateValue+"'" if operateValue else ""
                            runStr = keyWord+"("+tmpStr+")"
                            print(runStr)
                            try:
                                # 通过eval函数,将拼接的页面动作函数调用的字符串表示
                                # 当成有效的Python表达式执行,从而执行测试步骤的sheet
                                # 中关键字在PageAction.py文件中对应的映射方法,
                                # 来完成对页面元素的操作
                                eval(runStr)
                            except Exception as e:
                                log.info(u"执行步骤%s发生异常"%(stepRow[testStep_testStepDescribe-1].value))
                                # 截取异常屏幕图片
                                capturePic = capture_screen()
                                # 获取详细的异常堆栈信息
                                errorInfo = traceback.format_exc()
                                writeTestResult(caseStepObj,rowNo=index,
                                                colsNo="caseStep",testResult="faild",
                                                errorInfo=str(errorInfo),picPath=capturePic)
                            else:
                                successfulSteps +=1
                                log.info(u'执行步骤%s成功'%(stepRow[testStep_testStepDescribe-1].value))
                                writeTestResult(caseStepObj,rowNo=index,colsNo="caseStep",testResult="pass")
                        if successfulSteps == stepNums -1:
                            successfulCase+=1
                            log.info(u'用例%s执行通过'%(caseName))
                            writeTestResult(caseSheet,rowNo=idx+2,
                                            colsNo="testCase",testResult="pass")
                        else:
                            log.info(u"用例%s执行失败"%(caseName))
                            writeTestResult(caseSheet,rowNo=idx+2,colsNo="testCase",testResult="faild")
                else:
                    # 清空不需要执行用例的执行时间和执行结果,
                    # 异常信息,异常图片单元格
                    writeTestResult(caseSheet,rowNo=idx+2,
                                    colsNo="testCase",testResult="")
            log.info(u"共%s条用例,%s条需要被执行,成功执行%s条"
                     %(len(isExecuteColumn)-1,requiredCase,successfulCase))
        except Exception as e:
            log.info("出现异常"+traceback.format_exc())
    

      util包为工具类包封装一些工具类

    DirAndTime是封装截图位置和时间信息

    # encoding = utf-8
    import time,os
    from datetime import datetime
    from config.VarConfig import screePicturesDir
    
    # 获取当前日期
    def getCurrentDate():
        timeTup = time.localtime()
        currentDate = str(timeTup.tm_year)+"-"+str(timeTup.tm_mon)+"-"+
            str(timeTup.tm_mday)
        return currentDate
    
    # 获取当前时间
    def getCurrentTime():
        timeStr = datetime.now()
        nowTime = timeStr.strftime('%H-%M-%S-%f')
        return nowTime
    
    # 创建截图存放目录
    def createCurrentDateDir():
        dirName = os.path.join(screePicturesDir,getCurrentDate())
        if not os.path.exists(dirName):
            os.makedirs(dirName)
        return dirName
    
    
    if __name__ == "__main__":
        print(getCurrentDate())
        print(getCurrentTime())
        print(createCurrentDateDir())
    

      Log封装Log类

    #coding=utf-8
    
    import logging
    import time
    from config.VarConfig import *
    
    class Log:
        def __init__(self):
            self.logname = os.path.join(LogPath, '{0}.log'.format(time.strftime('%Y-%m-%d')))
    
        def __printconsole(self, level, message):
            # 创建一个logger
            logger = logging.getLogger()
            logger.setLevel(logging.DEBUG)
            # 创建一个handler,用于写入日志文件
            fh = logging.FileHandler(self.logname,'a',encoding='utf-8')
            fh.setLevel(logging.DEBUG)
            # 再创建一个handler,用于输出到控制台
            ch = logging.StreamHandler()
            ch.setLevel(logging.DEBUG)
            # 定义handler的输出格式
            formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
            fh.setFormatter(formatter)
            ch.setFormatter(formatter)
            # 给logger添加handler
            logger.addHandler(fh)
            logger.addHandler(ch)
            # 记录一条日志
            if level == 'info':
                logger.info(message)
            elif level == 'debug':
                logger.debug(message)
            elif level == 'warning':
                logger.warning(message)
            elif level == 'error':
                logger.error(message)
            logger.removeHandler(ch)
            logger.removeHandler(fh)
            # 关闭打开的文件
            fh.close()
    
        def debug(self,message):
            self.__printconsole('debug', message)
    
        def info(self,message):
            self.__printconsole('info', message)
    
        def warning(self,message):
            self.__printconsole('warning', message)
    
        def error(self,message):
            self.__printconsole('error', message)
    
    
    if __name__ == "__main__":
    
        Log().info("infisdlfjkdsf")
    

      ObjectMap封装选择器类

    # encoding = utf-8
    from selenium.webdriver.support.ui import WebDriverWait
    
    
    # 获取单个元素
    def getElement(driver,locationType,locatorExpression):
        try:
            element = WebDriverWait(driver,30).until(
                lambda x:x.find_element(by=locationType,value=locatorExpression))
            return element
        except Exception as e:
            raise e
    
    # 获取多个相同类型的元素对象已List返回
    def getElements(driver,locationType,locatorExpression):
        try:
            element = WebDriverWait(driver,30).until(
                lambda x:x.find_elements(by=locationType,value=locatorExpression))
            return element
        except Exception as e:
            raise e
    

      ParseExcel封装读写Excel类

    # encoding = utf-8
    import openpyxl
    from openpyxl.styles import Border,Side,Font
    import time
    
    class ParseExcel(object):
        def __init__(self):
            self.worbook = None
            self.excelFile = None
            self.font = Font(color = None)#设置字体颜色
            # 颜色对应的RGB值
            self.RGBDict = {'read':'FFFF3030','green':'FF008B00'}
    
        def loadWorkBook(self,excelPathAndName):
            # 将Excel文件加载到内存,并获取其workbook对象
            try:
                self.workbook = openpyxl.load_workbook(excelPathAndName)
            except Exception as e:
                raise e
            self.excelFile = excelPathAndName
            return self.workbook
    
        def getSheetByName(self,sheetName):
            # 根据sheet名获取该sheet对象
            try:
                sheet = self.workbook.get_sheet_by_name(sheetName)
                return sheet
            except Exception as e:
                raise e
    
        def getSheetByIndex(self,sheetIndex):
            # 根据sheet的索引号获取该sheet对象
            try:
                sheetName = self.workbook.get_sheet_names()[sheetIndex]
            except Exception as e:
                raise e
            sheet = self.workbook.get_sheet_by_name(sheetName)
            return sheet
    
        def getRowsNumber(self,sheet):
            # 获取sheet中有数据区域的结束行号
            return sheet.max_row
    
        def getColsNumber(self,sheet):
            # 获取sheet中数据区域的结束列号
            return sheet.max_column
    
        def getStartRowNumber(self,sheet):
            # 获取sheet中有数据区域的开始的行号
            return sheet.min_row
    
        def getStartColNumber(self,sheet):
            # 获取sheet中有数据区域的开始的列号
            return sheet.min_column
    
        def getRow(self,sheet,rowNo):
            # 获取sheet中某一行,返回的是这一行所有的数据内容组成的tuple,
            # 下标从1开始,sheet.rows[1]表示第一列
            try:
                return list(sheet.rows)[rowNo - 1]
            except Exception as e:
                raise e
    
        def getColumn(self,sheet,colNo):
            # 获取sheet中某一列,返回的是这一列所有的数据内容组成tuple,
            # 下标从1开始,sheet.coulumns[1]表示第一列
            try:
                return list(sheet.columns)[colNo -1]
            except Exception as e:
                raise e
    
        def getCellOfValue(self,sheet,coordinate = None,rowNo = None,colsNo = None):
            # 根据单元格所在的位置索引获取该单元格中的值,下表从1开始
            # sheet.cell(row =1,column = 1).value,表示Excel中第一行第一列的值
            if coordinate != None:
                try:
                    return sheet[coordinate].value
                except Exception as e:
                    raise e
            elif coordinate is None and rowNo is not None and rowNo is not None and colsNo is not None:
                try:
                    return sheet.cell(row = rowNo,column = colsNo).value
                except Exception as e:
                    raise e
            else:
                raise  Exception("Insufficient Coordinates of cell!")
    
        def getCellOfObject(self,sheet,coordinate = None,rowNo = None,colsNo = None):
            # 获取某个单元格的对象,可以根据单元格所在位置的数字索引,
            # 也可以直接根据Excel中单元格的编码及坐标
            # 如getCellObject(sheet,coordinate = 'A1')或
            # getCellObject(sheet,rowNo = 1,colsNo = 2)
            if coordinate != None:
                try:
                    return sheet.cell(coordinate = coordinate)
                except Exception as e:
                    raise e
            elif coordinate == None and rowNo is not None and colsNo is not None:
                try:
                    return sheet.cell(row = rowNo,column = colsNo)
                except Exception as e:
                    raise e
            else:
                raise Exception("Insufficient Coordinates of cell!")
    
        def writeCell(self,sheet,content,coordinate = None,rowNo = None,colsNo = None,style = None):
            # 根据单元格在Excel中的编码坐标或者数字索引坐标向单元格中写入数据,
            # 下表从1开始,参数style表示字体的颜色的名字,比如red,green
            if coordinate is not None:
                try:
                    sheet.cell(coordinate = coordinate).value = content
                    if style is not None:
                        sheet.cell(coordinate = coordinate).
                            font = Font(color= self.RGBDict[style])
                    self.workbook.save(self.excelFile)
                except Exception as e:
                    raise e
            elif coordinate == None and rowNo is not None and colsNo is not None:
                try:
                    sheet.cell(row = rowNo,column = colsNo).value = content
                    if style:
                        sheet.cell(row = rowNo,column = colsNo).
                            font = Font(color=self.RGBDict[style])
                        self.workbook.save(self.excelFile)
                except Exception as e:
                    raise e
            else:
                raise Exception("Insufficient Coordinates of cell!")
    
        def writeCellCurrentTime(self,sheet,coordinate = None,rowNo = None,colsNo = None):
            # 写入当前的时间,下表从1开始
            now = int(time.time())#显示为时间戳
            timeArray = time.localtime(now)
            currentTime = time.strftime("%Y-%m-%d %H:%M:%S",timeArray)
            if coordinate is not None:
                try:
                    sheet.cell(coordinate = coordinate).value = currentTime
                    self.workbook.save(self.excelFile)
                except Exception as e:
                    raise e
            elif coordinate == None and rowNo is not None and colsNo is not None:
                try:
                    sheet.cell(row = rowNo,column = colsNo).value = currentTime
                    self.workbook.save(self.excelFile)
                except Exception as e:
                    raise e
            else:
                raise Exception("Insufficient Coordinates of cell!")
    
    
    if __name__ == "__main__":
        from config.VarConfig import *
        pe = ParseExcel()
        pe.loadWorkBook(dataFilePath)
        print('通过名称获取sheet对象的名称:',pe.getSheetByName(u'联系人').title)
        print('通过索引号获取sheet对象的名称:',pe.getSheetByIndex(0).title)
        sheet = pe.getSheetByIndex(0)
        print(type(sheet))
        print('获取最大行',pe.getRowsNumber(sheet))#获取最大行
        print('获取最大列',pe.getColsNumber(sheet))#获取最大列
        rows = pe.getRow(sheet,1)#获取第一行
        print(rows().value)
        for i in rows:
            print(i.value)
        print(pe.getCellOfValue(sheet,rowNo=1,colsNo=1))
        # pe.writeCell(sheet,u'我爱祖国',rowNo=10,colsNo=10)
        # pe.writeCellCurrentTime(sheet,rowNo=10,colsNo=11)
    

      WaitUtil封装显示等待元素

    # encoding = utf-8
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    import time
    class WaitUtil(object):
        def __init__(self,driver):
            self.locationTypeDict = {
                "xpath":By.XPATH,
                "id":By.ID,
                "name":By.NAME,
                "class_name":By.CLASS_NAME,
                "tag_name":By.TAG_NAME,
                "like_text":By.LINK_TEXT,
                "partial_link_text":By.PARTIAL_LINK_TEXT
            }
            self.driver = driver
            self.wait = WebDriverWait(self.driver,30)
    
        def presenceOfElementLocated(self,locationType,locatorExpression,*args):
            '''显示等待页面元素出现在Dom中,但并不一定可见,存在则返回该页面元素对象'''
            try:
                if locationType.lower() in self.locationTypeDict:
                    element = self.wait.until(EC.presence_of_element_located((self.locationTypeDict[
                                                                        locationType.lower()],locatorExpression)))
                    return element
                else:
                    raise TypeError(u"未找到定位方式,请确认定位方法是否写正确")
            except Exception as e:
                raise e
    
    
    
        def frameToBeAvailaBleSwitchToIt(self,locationType,locatorExpression,*args):
            '''
            检查Frame是否存在,存在则切换斤Frame控件中
            '''
            try:
                self.wait.until(EC.frame_to_be_available_and_switch_to_it((self.locationTypeDict[
                                                                              locationType.lower()],locatorExpression)))
            except Exception as e:
                raise e
    
        def visibilityOfElementLocated(self,locationType,locatorExpression,*args):
            '''显示等待页面元素出现'''
            try:
                element = self.wait.until(EC.visibility_of_element_located((
                    self.locationTypeDict[locationType.lower()],locatorExpression)))
                return element
            except Exception as e:
                raise e
    
    
    if __name__ == "__main__":
        from selenium import webdriver
        driver = webdriver.Chrome()
        driver.get("http://mail.163.com")
        wu = WaitUtil(driver)
    
        wu.frameToBeAvailaBleSwitchToIt("xpath","//iframe[starts-with(@id, 'x-URS-iframe')]")
        ps = wu.visibilityOfElementLocated("name","email")
        wc = wu.presenceOfElementLocated("name","email")
        # wc = WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.NAME, 'email')))
        wc.send_keys("1111")
        ps.send_keys("11111")
        time.sleep(5)
    
        driver.quit()
    

      

      

  • 相关阅读:
    WCF bindings comparison z
    DevExpress打印功能 z
    使用Topshelf 5步创建Windows 服务 z
    Log4net中的RollingFileAppender z
    Log4Net在Windows服务中不能记录日志 z
    dev 注册方法 z
    async callback z
    多窗体之间方法调用 z
    [JS6] 通过用户事件事件执行脚本
    [JS5] 利用onload执行脚本
  • 原文地址:https://www.cnblogs.com/zhmiao/p/10613482.html
Copyright © 2011-2022 走看看