Esempio n. 1
0
class ObjectMap():
    def __init__(self, driver):
        self.driver = driver
        self.parseyaml = ParseYaml()
        self.byDic = {
            'id': By.ID,
            'name': By.NAME,
            'css': By.CSS_SELECTOR,
            'link_text': By.LINK_TEXT,
            'xpath': By.XPATH,
            'class': By.CLASS_NAME,
            'tag': By.TAG_NAME,
            'link': By.PARTIAL_LINK_TEXT
        }

    def getElement(self, by, locator):
        """
        查找单个元素对象
        :param driver:
        :param by:
        :param locator:
        :return: 元素对象
        """

        try:
            if by.lower() in self.byDic:
                element = WebDriverWait(
                    self.driver,
                    self.parseyaml.ReadTimeWait('elementtime')).until(
                        EC.presence_of_element_located(
                            (self.byDic[by.lower()], locator)))
                logger.info('通过%s定位元素%s' % (by, locator))
                return element
        except Exception as e:
            logger.info('元素定位失败')
            print(e)

    def getElements(self, by, locator):
        '''
        查找元素组
        :param driver:
        :param by:
        :param locator:
        :return: 元素组对象
        '''
        try:
            if by.lower() in self.byDic:
                elements = WebDriverWait(
                    self.driver,
                    self.parseyaml.ReadTimeWait('elementtime')).until(
                        EC.presence_of_all_elements_located((by, locator)))
                logger.info('通过%s定位元素组%s' % (by, locator))
                return elements
        except Exception as e:
            logger.info('元素组定位失败')
            print(e)
Esempio n. 2
0
 def __init__(self):
     self.parseyaml = ParseYaml()
     self.byDic = {
         'id': By.ID,
         'name': By.NAME,
         'css': By.CSS_SELECTOR,
         'link_text': By.LINK_TEXT,
         'xpath': By.XPATH,
         'class': By.CLASS_NAME,
         'tag': By.TAG_NAME,
         'link': By.PARTIAL_LINK_TEXT
     }
Esempio n. 3
0
 def setUp(self):
     self.parseyaml = ParseYaml()
     self.testdata_path = self.parseyaml.ReadParameter('ImportAddress')
     self.parseexcel = ParseExcel(self.testdata_path)
     self.pageaction = PageAction()
     self.sheetnames = self.parseexcel.wb.sheetnames
     self.parameter = CONFIG_PATH + 'Parameter.yaml'
     self.CaseNum = 0
     # 创建六个字典,分别储存步骤测试结果,用例测试结果,用例测试时间,错误信息,截图信息,步骤测试时间
     self.time_dic = {}
     self.result_dic = {}
     self.error_dic = {}
     self.picture_dic = {}
     self.caseResult_dic = {}
     self.caseTime_dic = {}
     self.font = Font(color=None)
Esempio n. 4
0
 def __init__(self, filename):
     self.filename = filename
     self.parseyaml = ParseYaml()
     pythoncom.CoInitialize()
     self.app = win32com.client.Dispatch('Excel.Application')
     # 读取excel文件
     self.wb = self.app.Workbooks.Open(filename)
     pythoncom.CoInitialize()
     self.logger = Logger('logger').getlog()
Esempio n. 5
0
 def RunReport(self):
     report_path = ParseYaml().ReadParameter('ReportAddress') # 报告存放位置
     timestr = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
     filename = report_path+'\\'+timestr+'.html'
     fp = open(filename, 'wb')
     # suites = unittest.defaultTestLoader.discover(TESTCASE_PATH, pattern='test*.py', top_level_dir=TESTCASE_PATH)
     suites = unittest.TestSuite()
     suites.addTest(RunnerTestCase('test_Case'))
     runner = HTMLTestRunner(
         title='自动化测试报告',
         description='',
         stream=fp,
         verbosity=2,
     )
     runner.run(suites)
     fp.close()
Esempio n. 6
0
class PageAction(object):
    def __init__(self):
        self.parseyaml = ParseYaml()
        self.byDic = {
            'id': By.ID,
            'name': By.NAME,
            'css': By.CSS_SELECTOR,
            'link_text': By.LINK_TEXT,
            'xpath': By.XPATH,
            'class': By.CLASS_NAME,
            'tag': By.TAG_NAME,
            'link': By.PARTIAL_LINK_TEXT
        }

    def openBrowser(self):
        version = self.parseyaml.ReadParameter('Version')
        # 获取浏览器类型
        browser = self.parseyaml.ReadParameter('Browser')
        if browser == 'Google Chrome':
            logger.info("选择的浏览器为:%s浏览器" % browser)
            print("选择的浏览器为:%s浏览器" % browser)
            if '70' == version:
                path = DRIVERS_PATH + 'chrome\\' + '70.0.3538.97\\chromedriver.exe'
            elif '71' == version:
                path = DRIVERS_PATH + 'chrome\\' + '71.0.3578.137\\chromedriver.exe'
            elif '72' == version:
                path = DRIVERS_PATH + 'chrome\\' + '72.0.3626.69\\chromedriver.exe'
            elif '73' == version:
                path = DRIVERS_PATH + 'chrome\\' + '73.0.3683.68\\chromedriver.exe'
            elif '74' == version:
                path = DRIVERS_PATH + 'chrome\\' + '74.0.3729.6\\chromedriver.exe'
            elif '75' == version:
                path = DRIVERS_PATH + 'chrome\\' + '75.0.3770.140\\chromedriver.exe'
            elif '76' == version:
                path = DRIVERS_PATH + 'chrome\\' + '76.0.3809.126\\chromedriver.exe'
            elif '77' == version:
                path = DRIVERS_PATH + 'chrome\\' + '77.0.3865.40\\chromedriver.exe'
            elif '78' == version:
                path = DRIVERS_PATH + 'chrome\\' + '78.0.3904.11\\chromedriver.exe'
            elif '79' == version:
                path = DRIVERS_PATH + 'chrome\\' + '79.0.3945.16\\chromedriver.exe'
            elif '86' == version:
                path = DRIVERS_PATH + 'chrome\\' + '86.0.4240.22\\chromedriver.exe'
            else:
                logger.info('浏览器版本不符合,请检查浏览器版本')
                return
            option = Options()
            option.add_experimental_option('w3c', False)
            option.add_argument('--start-maximized')
            self.driver = webdriver.Chrome(executable_path=path,
                                           options=option)
            logger.info('启动谷歌浏览器')
            print('启动谷歌浏览器')
        elif browser == 'FireFox':
            logger.info("选择的浏览器为:%s浏览器" % browser)
            path = DRIVERS_PATH + 'firefox\\' + 'geckodriver.exe'
            self.driver = webdriver.Firefox(executable_path=path)
            self.driver.maximize_window()
            logger.info('启动火狐浏览器')
            print('启动火狐浏览器')
        else:
            # 驱动创建完成后,等待创建实例对象
            WaitUnit(self.driver)

    def openBrowsers(self, browser):
        try:
            version = self.parseyaml.ReadParameter('Version')
            # 获取浏览器类型
            if browser == 'Google Chrome':
                logger.info("选择的浏览器为:%s浏览器" % browser)
                print("选择的浏览器为:%s浏览器" % browser)
                if '70' == version:
                    path = DRIVERS_PATH + 'chrome\\' + '70.0.3538.97\\chromedriver.exe'
                elif '71' == version:
                    path = DRIVERS_PATH + 'chrome\\' + '71.0.3578.137\\chromedriver.exe'
                elif '72' == version:
                    path = DRIVERS_PATH + 'chrome\\' + '72.0.3626.69\\chromedriver.exe'
                elif '73' == version:
                    path = DRIVERS_PATH + 'chrome\\' + '73.0.3683.68\\chromedriver.exe'
                elif '74' == version:
                    path = DRIVERS_PATH + 'chrome\\' + '74.0.3729.6\\chromedriver.exe'
                elif '75' == version:
                    path = DRIVERS_PATH + 'chrome\\' + '75.0.3770.140\\chromedriver.exe'
                elif '76' == version:
                    path = DRIVERS_PATH + 'chrome\\' + '76.0.3809.126\\chromedriver.exe'
                elif '77' == version:
                    path = DRIVERS_PATH + 'chrome\\' + '77.0.3865.40\\chromedriver.exe'
                elif '78' == version:
                    path = DRIVERS_PATH + 'chrome\\' + '78.0.3904.11\\chromedriver.exe'
                elif '79' == version:
                    path = DRIVERS_PATH + 'chrome\\' + '79.0.3945.16\\chromedriver.exe'
                elif '86' == version:
                    path = DRIVERS_PATH + 'chrome\\' + '86.0.4240.22\\chromedriver.exe'
                else:
                    logger.info('浏览器版本不符合,请检查浏览器版本')
                    return
                option = Options()
                option.add_experimental_option('w3c', False)
                option.add_argument('--start-maximized')
                self.driver = webdriver.Chrome(executable_path=path,
                                               options=option)
                logger.info('启动谷歌浏览器')
                print('启动谷歌浏览器')
            elif browser == 'FireFox':
                logger.info("选择的浏览器为:%s浏览器" % browser)
                path = DRIVERS_PATH + 'firefox\\' + 'geckodriver.exe'
                self.driver = webdriver.Firefox(executable_path=path)
                self.driver.maximize_window()
                logger.info('启动火狐浏览器')
                print('启动火狐浏览器')
        except Exception as e:
            logger.info('浏览器类型不符,请选择Chrome或者Firefox')
            print('浏览器类型不符,请选择Chrome或者Firefox')
            print(e)
        else:
            # 驱动创建完成后,等待创建实例对象
            WaitUnit(self.driver)

    def quitBrowser(self):
        logger.info('退出浏览器')
        print('退出浏览器')
        self.driver.quit()

    def closeBrowser(self):
        logger.info('关闭当前页面')
        print('关闭当前页面')
        self.driver.close()

    def back(self):
        '''
        退回浏览器上一个页面
        :return:
        '''
        # try:
        if self.driver.current_url == 'data:,':
            self.driver.back()
            logger.info('返回到%s' % self.driver.current_url)
            print('返回到%s' % self.driver.current_url)
        # except Exception as e:
        #     logger.info('退回浏览器失败')
        #     print('退回浏览器失败')
        #     print(e)
        else:
            logger.info('已经是第一个页面')
            print('已经是第一个页面')
            return

    def foword(self):
        '''
        前进浏览器上一个页面
        :return:
        '''
        # try:
        self.driver.forward()
        logger.info('前进到%s' % self.driver.current_url)
        print('前进到%s' % self.driver.current_url)
        # except Exception as e:
        #     logger.info('前进页面失败')
        #     print('前进页面失败')
        #     print(e)

    def refresh(self):
        '''
        刷新浏览器
        :return:
        '''
        logger.info('刷新浏览器')
        print('刷新浏览器')
        self.driver.refresh()

    def js_scroll_top(self):
        '''滚动到顶部'''
        js = "window.scrollTo(0,0)"
        self.driver.execute_script(js)

    def js_scroll_end(self):
        '''滚动到底部'''
        js = "window.scrollTo(0,document.body.scrollHeight)"
        self.driver.execute_script(js)

    def getUrl(self, url):
        """
        加载网址
        :return:
        """
        # try:
        logger.info('进入%s' % url)
        print('进入%s' % url)
        self.driver.get(url)
        # except Exception as e:
        #     logger.info('%s进入失败' % url)
        #     print('%s进入失败' % url)
        #     print(e)

    def sleep(self, sleepSeconds):
        """
        强制等待时间,单位S
        :param sleepSeconds:
        :return:
        """
        # try:
        logger.info('休眠%s秒' % sleepSeconds)
        print('休眠%s秒' % sleepSeconds)
        time.sleep(int(sleepSeconds))
        # except Exception as e:
        #     print(e)

    def clear(self, by, locator):
        """
        清空输入框
        :return:
        """
        # try:
        logger.info('清空输入框')
        print('清空输入框')
        ObjectMap(self.driver).getElement(by, locator).clear()
        # except Exception as e:
        #     logger.info('清空失败')
        #     print('清空失败')
        #     print(e)

    def inputValue(self, by, locator, value):
        """
        输入框输入值
        :param by:
        :param locator:
        :param value:
        :return:
        """
        # try:
        logger.info('输入框输入%s' % value)
        print('输入框输入%s' % value)
        ObjectMap(self.driver).getElement(by, locator).send_keys(value)
        # except Exception as e,
        #     logger.info('输入框输入值错误')
        #     print('输入框输入值错误')
        #     print(e)

    def clearAndInput(self, by, locator, value):
        '''
        清除输入框再输入值
        :return:
        '''
        logger.info('清空输入框')
        print('清空输入框')
        ObjectMap(self.driver).getElement(by, locator).clear()
        logger.info('输入框输入%s' % value)
        print('输入框输入%s' % value)
        ObjectMap(self.driver).getElement(by, locator).send_keys(value)

    def uploadFile(self, by, locator, value):
        '''
        上传单个文件input标签  type="file"
        :param by:
        :param locator:
        :param value:
        :return:
        '''
        ObjectMap(self.driver).getElement(by, locator).send_keys(value)
        logger.info('上传文件%s' % value)
        print('上传文件%s' % value)

    def uploadFiles(self, by, locator, value):
        '''
        上传多个文件,value为文件夹路径,input标签
        :param by:
        :param locator:
        :param value:
        :return:
        '''
        for root, dirs, files in os.walk(value):
            for i in files:
                ObjectMap(self.driver).getElement(
                    by, locator).send_keys(value + '\\' + i)
                logger.info('上传文件%s' % i)
                print('上传文件%s' % i)

    def upload_file_windows(self, file_path):
        '''
        :param file_path:上传文件的路径,需点击打开上传按钮,弹出windows窗口再调用 chrome 可调用
        :return:
        '''
        dialog = win32gui.FindWindow("#32770", u"打开")  #窗口左上角文字
        comboxex32 = win32gui.FindWindowEx(dialog, 0, "ComboBoxEx32", None)
        combox = win32gui.FindWindowEx(comboxex32, 0, "ComboBox", None)
        edit = win32gui.FindWindowEx(combox, 0, "Edit", None)
        button = win32gui.FindWindowEx(dialog, 0, "Button", "打开(&0)")
        win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, file_path)
        win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button)

    def assertTitle(self, titlestr):
        """
        断言页面标题
        :param titlestr:
        :return:
        """
        # try:
        logger.info('"%s"标题存在' % titlestr)
        print('"%s"标题存在' % titlestr)
        assert titlestr in self.driver.title, '%s标题不存在' % titlestr
        # except AssertionError as e:
        #     logger.info('"%s"标题不存在' % titlestr)
        #     print('"%s"标题不存在' % titlestr)
        #     print(e)
        # except Exception as e:
        #     logger.info('断言失败')
        #     print('断言失败')
        #     print(e)

    def assert_string_in_pageSource(self, assstring):
        """
        断言字符串是否包含在源码中
        :param assstring:
        :return:
        """
        # try:
        logger.info('"%s"存在页面中' % assstring)
        print('"%s"存在页面中' % assstring)
        assert assstring in self.driver.page_source, "'%s'在页面中不存在" % assstring
        # except AssertionError as e:
        #     logger.info('"%s"在页面中未找到' % assstring)
        #     print('"%s"在页面中未找到' % assstring)
        #     print(e)
        # except Exception as e:
        #     logger.info('断言失败')
        #     print('断言失败')
        #     print(e)

    def assertEqule(self, by, locator, value):
        '''
        检查指定元素字符串与预期结果是否相同
        :return:
        '''
        # try:
        getValue = ObjectMap(self.driver).getElement(
            by, locator).get_attribute('value')
        getText = ObjectMap(self.driver).getElement(by, locator).text
        if getValue == getText:
            assert ObjectMap(self.driver).getElement(
                by, locator).get_attribute('value') == value
            logger.info('%s=%s' % (ObjectMap(self.driver).getElement(
                by, locator).get_attribute('value'), value))
            print('%s=%s' % (ObjectMap(self.driver).getElement(
                by, locator).get_attribute('value'), value))
        elif getValue == '' or getValue is None:
            assert ObjectMap(self.driver).getElement(by, locator).text == value
            logger.info(
                '%s=%s' %
                (ObjectMap(self.driver).getElement(by, locator).text, value))
            print('%s=%s' %
                  (ObjectMap(self.driver).getElement(by, locator).text, value))
        elif getText == '' or getText is None:
            assert ObjectMap(self.driver).getElement(
                by, locator).get_attribute('value') == value
            logger.info('%s=%s' % (ObjectMap(self.driver).getElement(
                by, locator).get_attribute('value'), value))
            print('%s=%s' % (ObjectMap(self.driver).getElement(
                by, locator).get_attribute('value'), value))
        else:
            assert ObjectMap(self.driver).getElement(
                by, locator).get_attribute('value') == value
            logger.info('%s=%s' % (ObjectMap(self.driver).getElement(
                by, locator).get_attribute('value'), value))
            print('%s=%s' % (ObjectMap(self.driver).getElement(
                by, locator).get_attribute('value'), value))
        # except AssertionError:
        #     getValue = ObjectMap(self.driver).getElement(by, locator).get_attribute('value')
        #     getText = ObjectMap(self.driver).getElement(by, locator).text
        #     if getValue == getText:
        #         logger.info('%s!=%s' % (ObjectMap(self.driver).getElement(by, locator).get_attribute('value'), value))
        #         print('%s!=%s' % (ObjectMap(self.driver).getElement(by, locator).get_attribute('value'), value))
        #     elif getValue == '' or getValue is None:
        #         logger.info('%s!=%s' % (ObjectMap(self.driver).getElement(by, locator).text, value))
        #         print('%s!=%s' % (ObjectMap(self.driver).getElement(by, locator).text, value))
        #     elif getText == '' or getText is None:
        #         logger.info('%s!=%s' % (ObjectMap(self.driver).getElement(by, locator).get_attribute('value'), value))
        #         print('%s!=%s' % (ObjectMap(self.driver).getElement(by, locator).get_attribute('value'), value))
        #     else:
        #         logger.info('%s!=%s' % (ObjectMap(self.driver).getElement(by, locator).get_attribute('value'), value))
        #         print('%s!=%s' % (ObjectMap(self.driver).getElement(by, locator).get_attribute('value'), value))
        # except AttributeError:
        #     logger.info('页面中未找到元素')
        #     print('页面中未找到元素')
        # except TimeoutError:
        #     logger.info('页面中未找到元素')
        #     print('页面中未找到元素')
        # except Exception:
        #     logger.info('断言失败')
        #     print('断言失败')

    def assertLen(self, by, locator, value):
        '''
        检查指定元素字符串长度
        :return:
        '''
        # try:
        getValue = ObjectMap(self.driver).getElement(
            by, locator).get_attribute('value')
        getText = ObjectMap(self.driver).getElement(by, locator).text
        if getValue == getText:
            assert len(
                ObjectMap(self.driver).getElement(
                    by, locator).get_attribute('value')) == int(value)
            logger.info('"%s"长度为%s' % (ObjectMap(self.driver).getElement(
                by, locator).get_attribute('value'), value))
            print('"%s"长度为%s' % (ObjectMap(self.driver).getElement(
                by, locator).get_attribute('value'), value))
        elif getValue == '' or getValue is None:
            assert len(ObjectMap(self.driver).getElement(
                by, locator).text) == int(value)
            logger.info(
                '"%s"长度为%s' %
                (ObjectMap(self.driver).getElement(by, locator).text, value))
            print('"%s"长度为%s' %
                  (ObjectMap(self.driver).getElement(by, locator).text, value))
        elif getText == '' or getText is None:
            assert len(
                ObjectMap(self.driver).getElement(
                    by, locator).get_attribute('value')) == int(value)
            logger.info('"%s"长度为%s' % (ObjectMap(self.driver).getElement(
                by, locator).get_attribute('value'), value))
            print('"%s"长度为%s' % (ObjectMap(self.driver).getElement(
                by, locator).get_attribute('value'), value))
        else:
            assert len(
                ObjectMap(self.driver).getElement(
                    by, locator).get_attribute('value')) == int(value)
            logger.info('"%s"长度为%s' % (ObjectMap(self.driver).getElement(
                by, locator).get_attribute('value'), value))
            print('"%s"长度为%s' % (ObjectMap(self.driver).getElement(
                by, locator).get_attribute('value'), value))
        # except AssertionError as e:
        #     logger.info('"%s" 在页面中未找到' % ObjectMap(self.driver).getElement(by,locator).get_attribute('value'))
        #     print('"%s" 在页面中未找到' % ObjectMap(self.driver).getElement(by,locator).get_attribute('value'))
        # except TimeoutException:
        #     logger.info('页面中未找到元素')
        #     print('页面中未找到元素')
        # except Exception as e:
        #     logger.info('断言失败')
        #     print('断言失败')

    def assertElement(self, by, locator):
        '''
        判断元素是否存在
        :return:
        '''
        # flag = True
        # try:
        assert ObjectMap(self.driver).getElement(by, locator)
        # return flag
        # except AssertionError as e:
        #     logger.info('页面中未找到元素')
        #     print('页面中未找到元素')
        # except TimeoutException:
        #     logger.info('页面中未找到元素')
        #     print('页面中未找到元素')
        # except Exception as e:
        #     logger.info('断言失败')
        #     print('断言失败')

    def assertUrl(self, Url):
        '''
        判断当前网址是否和指定网址相同
        :param Url:
        :return:
        '''
        assert self.driver.current_url == Url
        logger.info('%s==%s' % (self.driver.current_url, Url))
        print('%s==%s' % (self.driver.current_url, Url))

    def getTitle(self):
        """
        获取页面title
        :return:
        """
        try:
            logger.info('获取页面标题:%s' % self.driver.title)
            print('获取页面标题:%s' % self.driver.title)
            return self.driver.title
        except Exception as e:
            logger.info('获取页面标题失败')
            print('获取页面标题失败')

    def getPageSource(self):
        """
        获取页面源码
        :return:
        """
        # try:
        return self.driver.page_source
        # except Exception as e:
        #     print(e)

    def switchToFrame(self, by, locator):
        """
        切换到frame页面内
        :param by:
        :param locator:
        :return:
        """
        # try:
        self.driver.switch_to.frame(
            ObjectMap(self.driver).getElement(by, locator))
        # except Exception as e:
        #     print(e)

    def switchToDefault(self):
        """
        切换到默认的frame页面
        :return:
        """
        # try:
        self.driver.switch_to.default_content()
        # except Exception as e:
        #     print(e)

    def click(self, by, locator):
        """
        元素点击
        :return:
        """
        # try:
        logger.info('点击元素:%s' % locator)
        print('点击元素:%s' % locator)
        ObjectMap(self.driver).getElement(by, locator).click()
        # except Exception as e:
        #     logger.info('点击元素失败')
        #     print('点击元素失败')
        #     print(e)

    def saveScreeShot(self, file, casename):
        """
        屏幕截图
        :return:
        """
        picturename = SCREENSHOTS_PATH + file + '\\' + casename
        if not os.path.exists(picturename):
            os.makedirs(picturename)
            picturename = picturename + '\\' + DirAndTime.getCurrentTime(
            ) + '.png'
        else:
            picturename = picturename + '\\' + DirAndTime.getCurrentTime(
            ) + '.png'
        try:
            self.driver.get_screenshot_as_file(picturename)
        except Exception as e:
            print(e)
        else:
            return picturename

    def wait_find_element(self, by, locator):
        '''
        显性等待30S判断单个元素是否可见,可见返回元素,否则抛出异常
        :param loc: 传入参数为By.xx(xx为元素定位方式),Value(为元素定位内容)
        :return:
        '''
        # try:
        if by.lower() in self.byDic:
            element = WebDriverWait(self.driver, 30).until(
                EC.presence_of_element_located(
                    (self.byDic[by.lower()], locator)))
            return element
        # except NoSuchElementException:
        #     logger.exception('找不到元素')
        #     print('找不到元素')
        # except TimeoutException:
        #     logger.exception('元素查找超时')
        #     print('元素查找超时')
        # except:
        #     logger.exception('查找失败')
        #     print('查找失败')

    def not_wait_find_element(self, by, locator):
        '''
        显性等待60S判断单个元素是否可见,可见返回元素,否则抛出异常
        :param loc: 传入参数为By.xx(xx为元素定位方式),Value(为元素定位内容)
        :return:
        '''
        # try:
        if by.lower() in self.byDic:
            element = WebDriverWait(self.driver, 30).until_not(
                EC.presence_of_element_located(
                    (self.byDic[by.lower()], locator)))
            return element
        # except NoSuchElementException:
        #     logger.exception('找不到元素')
        #     print('找不到元素')
        # except TimeoutException:
        #     logger.exception('元素查找超时')
        #     print('元素查找超时')
        # except:
        #     logger.exception('查找失败')
        #     print('查找失败')

    def text_wait_find_element(self, by, locator):
        '''
        显性等待30S判断单个元素是否可见,可见返回元素,否则抛出异常
        :param loc: 传入参数为By.xx(xx为元素定位方式),Value(为元素定位内容)
        :return:
        '''
        # try:
        if by.lower() in self.byDic:
            element = WebDriverWait(self.driver, 30).until(
                EC.text_to_be_present_in_element(self.byDic[by.lower()],
                                                 locator))
            return element
        # except NoSuchElementException:
        #     logger.exception('找不到元素')
        #     print('找不到元素')
        # except TimeoutException:
        #     logger.exception('元素查找超时')
        #     print('元素查找超时')
        # except:
        #     logger.exception('查找失败')
        #     print('查找失败')

    def not_text_wait_find_element(self, by, locator):
        '''
        显性等待30S判断单个元素是否可见,可见返回元素,否则抛出异常
        :param loc: 传入参数为By.xx(xx为元素定位方式),Value(为元素定位内容)
        :return:
        '''
        # try:
        if by.lower() in self.byDic:
            element = WebDriverWait(self.driver, 30).until_not(
                EC.text_to_be_present_in_element(self.byDic[by.lower()],
                                                 locator))
            return element
        # except NoSuchElementException:
        #     logger.exception('找不到元素')
        #     print('找不到元素')
        # except TimeoutException:
        #     logger.exception('元素查找超时')
        #     print('元素查找超时')
        # except:
        #     logger.exception('查找失败')
        #     print('查找失败')

    def move_to_element(self, by, locator):
        '''
        :param loc:loc = (By.xx,element)
        :return:
        '''
        # try:
        element = self.driver.find_element(by, locator)
        t = self.driver.find_element(by, locator).text
        ActionChains(self.driver).move_to_element(element).perform()
        logger.info("鼠标悬浮在%s" % t)
        print("鼠标悬浮在%s" % t)
        # except:
        #     logger.exception("未找到元素")
        #     print("未找到元素")

    def dropDown(self, p):
        """
        边框下拉滑动
        :param p:
        :return:
        """
        js = "var q=document.documentElement.scrollTop=%s" % p
        self.driver.execute_script(js)
        logger.info("滑动下拉框-距离%s" % p)
        print("滑动下拉框-距离%s" % p)

    def scroll_top(self):
        '''滚动到顶部'''
        js = "var q=document.documentElement.scrollTop=0"
        self.driver.execute_script(js)

    def scroll_end(self):
        '''滚动到底部'''
        js = "window.scrollTo(0,document.body.scrollHeight)"
        self.driver.execute_script(js)

    def Enter(self, by, locator):
        # 模拟键盘回车
        ObjectMap(self.driver).getElement(by, locator).send_keys(Keys.ENTER)

    def Down_end(self, count):
        '''
        模拟按下键盘的 下 箭头 方向键,count 为按下的次数
        :return:
        '''
        for i in range(count):
            self.driver.execute_script(
                'window.scrollTo(0, document.body.scrollHeight)')
            ActionChains(self.driver).key_down(Keys.DOWN).perform()
Esempio n. 7
0
    def test_Case(self):
        try:
            # self.setUp()
            # 获取循环次数
            loop = int(self.parseyaml.ReadParameter('loop'))
            # 获取模块名
            moudle = self.parseyaml.ReadParameter('Moudle')
            # 清除用例旧数据
            self.parseexcel.clearCaseColumnValue(self.sheetnames[0])
            # 清除步骤旧数据
            for i, v in enumerate(self.sheetnames):
                if i == 0:
                    continue
                else:
                    self.parseexcel.clearStepColumnValue(v)
            for l in range(loop):
                # 用例运行数
                try:
                    # 获取'是否执行'列
                    isimplement = self.parseexcel.getColumnValue(self.sheetnames[0], testCase_Isimplement)
                    # 循环'是否执行'列
                    # 如果执行,且模块名符合,则获取用例编号,并切换到对应的工作表,执行用例
                    for index, value in enumerate(isimplement):
                        if moudle == '全部':
                            pd = "value.lower() == 'y'"
                        else:
                            pd = 'value.lower() == "y" and moudle ' \
                                 '== self.parseexcel.getCellValue(self.sheetnames[0], index + 2, testCase_Sheet)'
                        try:
                            # 如果是否执行为空则跳过执行
                            if value is None or value == '':
                                continue
                            elif eval(pd):
                                # 根据'是否执行';列索引获取对应的工作表名
                                sheetname = self.parseexcel.getCellValue(self.sheetnames[0], index + 2, testCase_Sheet)
                                # 根据'是否执行'列索引获取对应的用例编号
                                testcasenum = self.parseexcel.getCellValue(self.sheetnames[0], index + 2, testCase_Num)
                                # 切换到用例对应的工作表
                                # sheetnames = self.parseexcel.wb[sheetname]
                                '''
                                根据用例编号(testcasenum)获取预置条件编号
                                '''
                                # 获取用例步骤的用例编号类,并执行对应用例编号的用例步骤(增加表内是否有合并单元格的判断)
                                if self.parseexcel.ismerge(sheetname):
                                    teststepnum = self.parseexcel.getMergeColumnValue(sheetname, testStep_Num)
                                else:
                                    teststepnum = self.parseexcel.getColumnValue(sheetname, testStep_Num)
                                # 循环用例步骤编号,根据索引获取预置条件编号
                                testPrenum = ''
                                for i, v in enumerate(teststepnum):
                                    if v == testcasenum:
                                        # 用例前置条件编号
                                        testPrenum = self.parseexcel.getCellValue(sheetname, i + 2, testStep_Preset)
                                        break

                                # 循环用例步骤编号,找到与预置条件编号相同的用例步骤编号
                                # 循环所有的步骤编号
                                # 获取对应用例编号的步骤编号的关键字,定位方式,表达式,操作值
                                url = ParseYaml().ReadParameter('IP')
                                while re.match(r"^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$", url) is None and re.match(r'[^\s]*[.com|.cn]', url) is None:
                                    url = ParseYaml().ReadParameter('IP')  # 从输入框获取浏览器地址
                                    # 先打开浏览器,进入指定IP地址
                                    time.sleep(1)
                                self.pageaction.openBrowser()
                                self.pageaction.getUrl('http://%s' % url)
                                # 执行预置条件
                                for t, v in enumerate(teststepnum):
                                    if v == testPrenum:
                                        # 用例执行步骤
                                        pre_stepname = self.parseexcel.getCellValue(sheetname, t + 2, testStep_Describe)
                                        # 获取预置条件关键字
                                        pre_keyword = self.parseexcel.getCellValue(sheetname, t + 2, testStep_KeyWord)
                                        # 去除前后空格
                                        if pre_keyword is not None:
                                            pre_keyword = pre_keyword.strip()
                                        # 获取定位方式
                                        pre_location = self.parseexcel.getCellValue(sheetname, t + 2, testStep_Location)
                                        # 去除前后空格
                                        if pre_location is not None:
                                            pre_location = pre_location.strip()
                                        # 获取定位表达式
                                        pre_locator = self.parseexcel.getCellValue(sheetname, t + 2, testStep_Locator)
                                        if type(pre_locator) is int:
                                            pre_locator = str(self.parseexcel.getCellValue(sheetname, t + 2, testStep_Locator))
                                        # 获取输入值
                                        pre_testvalue = self.parseexcel.getCellValue(sheetname, t + 2, testStep_Value)
                                        # 如果输入值为 int 类型,则强转为 str 类型,用于字符串拼接
                                        if type(pre_testvalue) is int:
                                            pre_testvalue = str(self.parseexcel.getCellValue(sheetname, t + 2, testStep_Value))
                                        # 总共有四种情况可以正常执行,其他情况则会将用例判断为运行失败
                                        # 1.关键字,定位方式,表达式,输入值全部不为空的情况 例:send_keys
                                        # 2.关键字,输入值不为空,定位方式,表达式为空的情况 例:assert(断言)
                                        # 3.关键字,定位方式,表达式不为空,输入值为空的情况 例:click
                                        # 4.关键字不为空,定位方式,表达式,输入值为空的情况 例 getTitle
                                        if pre_keyword and pre_location and pre_locator and pre_testvalue:
                                            pre_fun = 'self.pageaction' + '.' + pre_keyword + '(' + '"' + pre_location + '"' + ', ' + '"' + pre_locator + '"' + ', ' + '"' + \
                                                      pre_testvalue + '"' + ')'
                                        elif pre_keyword and pre_testvalue and pre_location is None or pre_location == '' \
                                                and pre_locator is None or pre_location == '':
                                            pre_fun = 'self.pageaction' + '.' + pre_keyword + '(' + '"' + pre_testvalue + '"' + ')'
                                        elif pre_keyword and pre_location and pre_locator and pre_testvalue is None or pre_testvalue == '':
                                            pre_fun = 'self.pageaction' + '.' + pre_keyword + '(' + '"' + pre_location + '"' + ', ' + '"' + pre_locator + '"' + ')'
                                        elif pre_keyword and pre_location is None or pre_location == '' and pre_locator is None \
                                                or pre_locator == '' and pre_testvalue is None or pre_testvalue == '':
                                            pre_fun = 'self.pageaction' + '.' + pre_keyword + '(' + ')'
                                        elif pre_keyword is None or pre_keyword == '' and pre_location is None or pre_location == '' \
                                                and pre_locator is None or pre_locator == '' and pre_testvalue is None or pre_testvalue == '':
                                            continue
                                        else:
                                            # 将结果以及错误信息存入字典
                                            self.result_dic.setdefault(sheetname, {})[t+2] = 'Skip'
                                            self.error_dic.setdefault(sheetname, {})[t+2] = '关键字对应参数错误'
                                            # self.parseexcel.writeCellValue(sheetname, t+2, testStep_Result+l, 'Skip')
                                            # self.parseexcel.writeCellValues(sheetname, t + 2, '关键字对应参数错误')
                                            logger.info('关键字对应参数错误')
                                            print('关键字对应参数错误')
                                            continue
                                        # 执行用例
                                        try:
                                            # eval 将字符串转换为可执行的python语句
                                            eval(pre_fun)
                                        # 抛出异常的情况,将失败结果写入excel表格中
                                        except TypeError:
                                            # 将结果以及错误信息存入字典
                                            self.result_dic.setdefault(sheetname, {})[t+2] = 'Skip'
                                            self.error_dic.setdefault(sheetname, {})[t+2] = '关键字参数个数错误,请检查参数'
                                            # 写入测试时间,测试结果,错误信息,错误截图
                                            # self.parseexcel.writeCellValue(sheetname, t+2, testStep_Result+l, 'Skip')
                                            # self.parseexcel.writeCellValues(sheetname, t + 2, '关键字参数个数错误,请检查参数')
                                            logger.info('步骤"{}"执行失败'.format(pre_stepname))
                                            logger.info('关键字参数个数错误,请检查参数')
                                            print('步骤"{}"执行失败'.format(pre_stepname))
                                            print('关键字参数个数错误,请检查参数')
                                        except TimeoutException:
                                            # 将结果以及错误信息存入字典
                                            self.result_dic.setdefault(sheetname, {})[t+2] = 'Skip'
                                            self.error_dic.setdefault(sheetname, {})[t+2] = '元素定位超时,' \
                                                                                            '请检查上一步是否执行成功,或元素定位方式'
                                            # 写入测试时间,测试结果,错误信息,错误截图
                                            # self.parseexcel.writeCellValue(sheetname, t+2, testStep_Result+l, 'Skip')
                                            # self.parseexcel.writeCellValues(sheetname, t + 2, '元素定位超时,'
                                            #                                                             '请检查上一步是否执行成功,或元素定位方式')
                                            logger.info('步骤"{}"执行失败'.format(pre_stepname))
                                            logger.info('元素定位超时,请检查上一步是否执行成功,或元素定位方式')
                                            print('步骤"{}"执行失败'.format(pre_stepname))
                                            print('元素定位超时,请检查上一步是否执行成功,或元素定位方式')
                                        except TimeoutError as e:
                                            # 将结果以及错误信息存入字典
                                            self.result_dic.setdefault(sheetname, {})[t + 2] = 'Failed'
                                            self.error_dic.setdefault(sheetname, {})[t + 2] = '断言失败'
                                            logger.info('步骤"{}"执行失败'.format(pre_stepname))
                                            print('步骤"{}"执行失败'.format(pre_stepname))
                                            logger.info(e)
                                        except AttributeError as e:
                                            # 将结果以及错误信息存入字典
                                            self.result_dic.setdefault(sheetname, {})[t + 2] = 'Skip'
                                            self.error_dic.setdefault(sheetname, {})[t + 2] = '元素定位超时,请检查元素定位'
                                            logger.info('步骤"{}"执行失败'.format(pre_stepname))
                                            print('步骤"{}"执行失败'.format(pre_stepname))
                                            logger.info(e)
                                        except AssertionError:
                                            # 将结果以及错误信息存入字典
                                            self.result_dic.setdefault(sheetname, {})[t+2] = 'Failed'
                                            self.error_dic.setdefault(sheetname, {})[t+2] = '断言失败'
                                            # 写入测试时间,测试结果,错误信息,错误截图
                                            # self.parseexcel.writeCellValue(sheetname, t+2, testStep_Result+l, 'Failed')
                                            # self.parseexcel.writeCellValues(sheetname, t + 2, '断言失败')
                                            logger.info('步骤"{}"执行失败'.format(pre_stepname))
                                            print('步骤"{}"执行失败'.format(pre_stepname))
                                        except WebDriverException:
                                            # 将结果以及错误信息存入字典
                                            self.result_dic.setdefault(sheetname, {})[t+2] = 'Skip'
                                            self.error_dic.setdefault(sheetname, {})[t+2] = '浏览器异常,' \
                                                                                            '请检查浏览器驱动或运行过程中是否被强制关闭'
                                            # 写入测试时间,测试结果,错误信息,错误截图
                                            # self.parseexcel.writeCellValue(sheetname, t+2, testStep_Result+l, 'Skip')
                                            # self.parseexcel.writeCellValues(sheetname, t + 2, '浏览器异常,'
                                            #                                                             '请检查浏览器驱动或运行过程中是否被强制关闭')
                                            logger.info('步骤"{}"执行失败'.format(pre_stepname))
                                            logger.info('浏览器异常,请检查浏览器驱动或运行过程中是否被强制关闭')
                                            print('步骤"{}"执行失败'.format(pre_stepname))
                                            print('浏览器异常,请检查浏览器驱动或运行过程中是否被强制关闭')
                                        except Exception:
                                            error_info = traceback.format_exc()
                                            # 将结果以及错误信息存入字典
                                            self.result_dic.setdefault(sheetname, {})[t+2] = 'Skip'
                                            self.error_dic.setdefault(sheetname, {})[t+2] = error_info
                                            # # 写入测试时间,测试结果,错误信息,错误截图
                                            # self.parseexcel.writeCellValue(sheetname, t+2, testStep_Result+l, 'Skip')
                                            # self.parseexcel.writeCellValues(sheetname, t + 2, error_info)
                                            logger.info('步骤"{}"执行失败'.format(pre_stepname))
                                            print('步骤"{}"执行失败'.format(pre_stepname))
                                        else:
                                            # 写入测试结果
                                            # 将结果以及错误信息存入字典
                                            self.result_dic.setdefault(sheetname, {})[t+2] = 'Pass'
                                            # self.parseexcel.writeCellValue(sheetname, t + 2, testStep_Result+l, 'Pass')
                                            logger.info('步骤"{}"执行成功'.format(pre_stepname))
                                            print('步骤"{}"执行成功'.format(pre_stepname))
                                        finally:
                                            # 截图

                                            bf.add_test_img()
                                            pic = self.pageaction.saveScreeShot(sheetname, testcasenum)
                                            # 将截图信息以及测试时间存入字典中
                                            Time = datetime.now()
                                            Time.strftime('%Y:%m:%d %H:%M:%S')
                                            self.picture_dic.setdefault(sheetname, {})[t+2] = pic
                                            self.time_dic.setdefault(sheetname, {})[t + 2] = Time
                                            # self.parseexcel.writeCellValue(sheetname, t + 2, testStep_Picture, pic)
                                            # self.parseexcel.writeCellTime(sheetname, t + 2, testStep_EndTime)
                                    else:
                                        continue

                                # 将用例步骤工作表内的用例编号以字典的方式循环
                                for t, v in enumerate(teststepnum):
                                    # 用例步骤(用例编号) 与 用例列表(用例编号)相同的
                                    if v == testcasenum:
                                        # 用例执行步骤
                                        stepname = self.parseexcel.getCellValue(sheetname, t + 2, testStep_Describe)
                                        # 获取关键字
                                        keyword = self.parseexcel.getCellValue(sheetname, t + 2, testStep_KeyWord)
                                        # 去除前后空格
                                        if keyword is not None:
                                            keyword = keyword.strip()
                                        # 获取定位方式
                                        location = self.parseexcel.getCellValue(sheetname, t + 2, testStep_Location)
                                        # 去除前后空格
                                        if location is not None:
                                            location = location.strip()
                                        # 获取定位表达式
                                        locator = self.parseexcel.getCellValue(sheetname, t + 2, testStep_Locator)
                                        if type(locator) is int:
                                            locator = str(self.parseexcel.getCellValue(sheetname, t + 2, testStep_Locator))
                                        # 获取输入值
                                        testvalue = self.parseexcel.getCellValue(sheetname, t + 2, testStep_Value)
                                        # 如果输入值为 int 类型,则强转为 str 类型,用于字符串拼接
                                        if testvalue is not None and type(testvalue) is not str:
                                            testvalue = str(self.parseexcel.getCellValue(sheetname, t + 2, testStep_Value))
                                        # if testvalue.lower() == 'none':
                                        #     testvalue = ''
                                        # 进行关键字拼接
                                        # 总共有四种情况可以正常执行,其他情况则会将用例判断为运行失败
                                        # 1.关键字,定位方式,表达式,输入值全部不为空的情况 例:send_keys
                                        # 2.关键字,输入值不为空,定位方式,表达式为空的情况 例:assert(断言)
                                        # 3.关键字,定位方式,表达式不为空,输入值为空的情况 例:click
                                        # 4.关键字不为空,定位方式,表达式,输入值为空的情况 例 getTitle
                                        if keyword and location and locator and testvalue:
                                            fun = 'self.pageaction' + '.' + keyword + '(' + '"' + location + '"' + ', ' + '"' + locator + '"' + ', ' + '"' + \
                                                  testvalue + '"' + ')'
                                        elif keyword and testvalue and location is None or location == '' \
                                                and locator is None or location == '':
                                            fun = 'self.pageaction' + '.' + keyword + '(' + '"' + testvalue + '"' + ')'
                                        elif keyword and location and locator and testvalue is None or testvalue == '':
                                            fun = 'self.pageaction' + '.' + keyword + '(' + '"' + location + '"' + ', ' + '"' + locator + '"' + ')'
                                        elif keyword and location is None or location == '' and locator is None \
                                                or locator == '' and testvalue is None or testvalue == '':
                                            fun = 'self.pageaction' + '.' + keyword + '(' + ')'
                                        elif keyword is None or keyword == '' and location is None or location == '' \
                                                and locator is None or locator == '' and testvalue is None or testvalue == '':
                                            continue
                                        else:
                                            # 将结果以及错误信息存入字典
                                            self.result_dic.setdefault(sheetname, {})[t + 2] = 'Skip'
                                            self.error_dic.setdefault(sheetname, {})[t + 2] = '关键字对应参数错误'
                                            # self.parseexcel.writeCellValue(sheetname, t+2, testStep_Result+l, 'Skip')
                                            # self.parseexcel.writeCellValues(sheetname, t + 2, '关键字对应参数错误')
                                            logger.info('关键字对应参数错误')
                                            print('关键字对应参数错误')
                                            continue
                                        # 执行用例
                                        try:
                                            # eval 将字符串转换为可执行的python语句
                                            eval(fun)
                                        # 抛出异常的情况,将失败结果写入excel表格中
                                        except TypeError as e:
                                            # 将结果以及错误信息存入字典
                                            self.result_dic.setdefault(sheetname, {})[t + 2] = 'Skip'
                                            self.error_dic.setdefault(sheetname, {})[t + 2] = '关键字参数个数错误,请检查参数'
                                            # 写入测试时间,测试结果,错误信息,错误截图
                                            # self.parseexcel.writeCellValue(sheetname, t+2, testStep_Result+l, 'Skip')
                                            # self.parseexcel.writeCellValues(sheetname, t + 2, '关键字参数个数错误,请检查参数')
                                            logger.info('步骤"{}"执行失败'.format(stepname))
                                            logger.info('关键字参数个数错误,请检查参数')
                                            print('步骤"{}"执行失败'.format(stepname))
                                            print('关键字参数个数错误,请检查参数')
                                            logger.info(e)
                                        except TimeoutException as e:
                                            # 将结果以及错误信息存入字典
                                            self.result_dic.setdefault(sheetname, {})[t + 2] = 'Skip'
                                            self.error_dic.setdefault(sheetname, {})[t + 2] = '元素定位超时,' \
                                                                                              '请检查上一步是否执行成功,或元素定位方式'
                                            # 写入测试时间,测试结果,错误信息,错误截图
                                            # self.parseexcel.writeCellValue(sheetname, t+2, testStep_Result+l, 'Skip')
                                            # self.parseexcel.writeCellValues(sheetname, t + 2, '元素定位超时,'
                                            #                                                             '请检查上一步是否执行成功,或元素定位方式')
                                            logger.info('步骤"{}"执行失败'.format(stepname))
                                            logger.info('元素定位超时,请检查上一步是否执行成功,或元素定位方式')
                                            print('步骤"{}"执行失败'.format(stepname))
                                            print('元素定位超时,请检查上一步是否执行成功,或元素定位方式')
                                            logger.info(e)
                                        except TimeoutError as e:
                                            # 将结果以及错误信息存入字典
                                            self.result_dic.setdefault(sheetname, {})[t + 2] = 'Failed'
                                            self.error_dic.setdefault(sheetname, {})[t + 2] = '断言失败'
                                            logger.info('步骤"{}"执行失败'.format(stepname))
                                            print('步骤"{}"执行失败'.format(stepname))
                                            logger.info(e)
                                        except AttributeError as e:
                                            # 将结果以及错误信息存入字典
                                            self.result_dic.setdefault(sheetname, {})[t + 2] = 'Skip'
                                            self.error_dic.setdefault(sheetname, {})[t + 2] = '元素定位超时,请检查元素定位'
                                            logger.info('步骤"{}"执行失败'.format(stepname))
                                            print('步骤"{}"执行失败'.format(stepname))
                                            logger.info(e)
                                        except AssertionError as e:
                                            # 将结果以及错误信息存入字典
                                            self.result_dic.setdefault(sheetname, {})[t + 2] = 'Failed'
                                            self.error_dic.setdefault(sheetname, {})[t + 2] = '断言失败'
                                            # 写入测试时间,测试结果,错误信息,错误截图
                                            # self.parseexcel.writeCellValue(sheetname, t+2, testStep_Result+l, 'Failed')
                                            # self.parseexcel.writeCellValues(sheetname, t + 2, '断言失败')
                                            logger.info('步骤"{}"执行失败'.format(stepname))
                                            print('步骤"{}"执行失败'.format(stepname))
                                            logger.info(e)
                                        except WebDriverException as e:
                                            # 将结果以及错误信息存入字典
                                            self.result_dic.setdefault(sheetname, {})[t + 2] = 'Skip'
                                            self.error_dic.setdefault(sheetname, {})[t + 2] = '浏览器异常,' \
                                                                                              '请检查浏览器驱动或运行过程中是否被强制关闭'
                                            # 写入测试时间,测试结果,错误信息,错误截图
                                            # self.parseexcel.writeCellValue(sheetname, t+2, testStep_Result+l, 'Skip')
                                            # self.parseexcel.writeCellValues(sheetname, t + 2, '浏览器异常,'
                                            #                                                             '请检查浏览器驱动或运行过程中是否被强制关闭')
                                            logger.info('步骤"{}"执行失败'.format(stepname))
                                            logger.info('浏览器异常,请检查浏览器驱动或运行过程中是否被强制关闭')
                                            print('步骤"{}"执行失败'.format(stepname))
                                            print('浏览器异常,请检查浏览器驱动或运行过程中是否被强制关闭')
                                            logger.info(e)
                                        except Exception:
                                            error_info = traceback.format_exc()
                                            # 将结果以及错误信息存入字典
                                            self.result_dic.setdefault(sheetname, {})[t + 2] = 'Skip'
                                            self.error_dic.setdefault(sheetname, {})[t + 2] = error_info
                                            # # 写入测试时间,测试结果,错误信息,错误截图
                                            # self.parseexcel.writeCellValue(sheetname, t+2, testStep_Result+l, 'Skip')
                                            # self.parseexcel.writeCellValues(sheetname, t + 2, error_info)
                                            logger.info('步骤"{}"执行失败'.format(stepname))
                                            print('步骤"{}"执行失败'.format(stepname))
                                        else:
                                            # 写入测试结果
                                            # 将结果以及错误信息存入字典
                                            self.result_dic.setdefault(sheetname, {})[t + 2] = 'Pass'
                                            # self.parseexcel.writeCellValue(sheetname, t + 2, testStep_Result+l, 'Pass')
                                            logger.info('步骤"{}"执行成功'.format(stepname))
                                            print('步骤"{}"执行成功'.format(stepname))
                                        finally:
                                            # 截图
                                            bf.add_test_img()
                                            pic = self.pageaction.saveScreeShot(sheetname, testcasenum)
                                            # 将截图信息以及测试时间存入字典中
                                            Time = datetime.now()
                                            Time.strftime('%Y:%m:%d %H:%M:%S')
                                            self.picture_dic.setdefault(sheetname, {})[t + 2] = pic
                                            self.time_dic.setdefault(sheetname, {})[t + 2] = Time
                                            # self.parseexcel.writeCellValue(sheetname, t + 2, testStep_Picture, pic)
                                            # self.parseexcel.writeCellTime(sheetname, t + 2, testStep_EndTime)
                                    else:
                                        continue
                                self.CaseNum += 1
                                YamlWrite().Write_Yaml_Updata(self.parameter, 'CaseNum', self.CaseNum)
                                self.pageaction.quitBrowser()
                                # 写入测试结果
                                for r, v in self.result_dic.items():
                                    for a, b in v.items():
                                        if b == 'Pass':
                                            self.parseexcel.wb[r].cell(int(a), testStep_Result + l).font = Font(color='33ff33')
                                            self.parseexcel.wb[r].cell(int(a), testStep_Result + l, b)
                                        elif b == 'Failed':
                                            self.parseexcel.wb[r].cell(int(a), testStep_Result + l).font = Font(color='cc0000')
                                            self.parseexcel.wb[r].cell(int(a), testStep_Result + l, b)
                                        elif b == 'Skip':
                                            self.parseexcel.wb[r].cell(int(a), testStep_Result + l).font = Font(color='D1D1D1')
                                            self.parseexcel.wb[r].cell(int(a), testStep_Result + l, b)
                                        else:
                                            continue
                                # 通过循环对应 用例编号的步骤的结果,全部为pass的则写入用例Pass,有一条失败的则写入Failed
                                for s, b in enumerate(teststepnum):
                                    # 获取测试结果
                                    if b == testcasenum:
                                        if self.parseexcel.getCellValue(sheetname, s+2, testStep_Result) is None \
                                                or self.parseexcel.getCellValue(sheetname, s+2, testStep_Result) == '':
                                            continue
                                        elif self.parseexcel.getCellValue(sheetname, s+2, testStep_Result) == 'Pass':
                                            # 将用例测试结果存入字典
                                            self.caseResult_dic.setdefault(self.sheetnames[0], {})[index+2] = 'Pass'
                                            # self.parseexcel.writeCellValue(self.sheetnames[0], index+2, testCase_Result+l, 'Pass')
                                        elif self.parseexcel.getCellValue(sheetname, s+2, testStep_Result) == 'Skip':
                                            self.caseResult_dic.setdefault(self.sheetnames[0], {})[index+2] = 'Failed'
                                            break
                                            # self.parseexcel.writeCellValue(self.sheetnames[0], index + 2, testCase_Result+l,
                                            #                                'Failed')
                                        else:
                                            self.caseResult_dic.setdefault(self.sheetnames[0], {})[index+2] = 'Failed'
                                            break
                                            # self.parseexcel.writeCellValue(self.sheetnames[0], index + 2, testCase_Result+l,
                                            #                                'Failed')
                                Time = datetime.now()
                                Time.strftime('%Y:%m:%d %H:%M:%S')
                                # 增加时间写入,以及已运行数量统计
                                self.caseTime_dic.setdefault(self.sheetnames[0], {})[index+2] = Time
                                # self.parseexcel.writeCellTime(self.sheetnames[0], index + 2, testCase_EndTime)
                                # 增加用例时间运行间隔,默认1秒(通过配置文件进行修改)
                                time.sleep(self.parseyaml.ReadTimeWait('casetime'))
                            else:
                                continue
                        except Exception as e:
                            Time = datetime.now()
                            Time.strftime('%Y:%m:%d %H:%M:%S')
                            self.caseResult_dic.setdefault(self.sheetnames[0], {})[index + 2] = 'Failed'
                            self.caseTime_dic.setdefault(self.sheetnames[0], {})[index + 2] = Time
                            # self.parseexcel.writeCellTime(self.sheetnames[0], index + 2, testCase_EndTime)
                            # self.parseexcel.writeCellValue(self.sheetnames[0], index + 2, testCase_Result+l,
                            #                                'Failed')
                            self.CaseNum += 1
                            YamlWrite().Write_Yaml_Updata(self.parameter, 'CaseNum', self.CaseNum)
                            logger.info(e)
                    logger.info('正在写入测试结果,请勿关闭界面...')
                    # 读取所有字典,将结果写入excel中
                    for t, v in self.time_dic.items():
                        for a, b in v.items():
                            self.parseexcel.wb[t].cell(int(a), testStep_EndTime, b)
                    for e, v in self.error_dic.items():
                        for a, b in v.items():
                            self.parseexcel.wb[e].cell(int(a), testStep_Error, b)
                    for p, v in self.picture_dic.items():
                        for a, b in v.items():
                            self.parseexcel.wb[p].cell(int(a), testStep_Picture).value = '=HYPERLINK("{}", "{}")'.format(b, b)
                    for ct, v in self.caseTime_dic.items():
                        for a, b in v.items():
                            self.parseexcel.wb[ct].cell(int(a), testCase_EndTime, b)
                    for cr, v in self.caseResult_dic.items():
                        for a, b in v.items():
                            if b == 'Pass':
                                self.parseexcel.wb[cr].cell(int(a), testCase_Result + l).font = Font(color='33ff33')
                                self.parseexcel.wb[cr].cell(int(a), testCase_Result + l, b)
                            elif b == 'Failed':
                                self.parseexcel.wb[cr].cell(int(a), testCase_Result + l).font = Font(color='cc0000')
                                self.parseexcel.wb[cr].cell(int(a), testCase_Result + l, b)
                            else:
                                continue
                    # 获取excel中'用例工作表'列的不为None的总行数
                    total_case = list(filter(None, self.parseexcel.getColumnValue(self.sheetnames[0], testCase_Sheet)))
                    # 写入excel表的总用例数单元格中
                    self.parseexcel.writeCellValue(self.sheetnames[0], 1, 2, len(total_case)-1)
                    # 循环执行结果列中为pass的列
                    pass_case = []
                    faild_case = []
                    for pi in list(filter(None, self.parseexcel.getColumnValue(self.sheetnames[0], testCase_Result))):
                        if pi.lower() == 'pass':
                            pass_case.append(pi)
                        elif pi.lower() == 'failed':
                            faild_case.append(pi)
                        else:
                            continue
                    # 写入excel表中的通过用例数单元格中
                    self.parseexcel.writeCellValue(self.sheetnames[0], 1, 4, len(pass_case))
                    # 写入excel表中的失败用例数单元格中
                    self.parseexcel.writeCellValue(self.sheetnames[0], 1, 6, len(faild_case))
                    # 循环是否执行列的中n的数量
                    n_case = []
                    for ni in list(filter(None, self.parseexcel.getColumnValue(self.sheetnames[0], testCase_Isimplement))):
                        if ni.lower() == 'n':
                            n_case.append(ni)
                    # 写入excel表中的未测试用例的单元格中
                    self.parseexcel.writeCellValue(self.sheetnames[0], 1, 8, len(n_case))
                except Exception as e:
                    logger.info(e)
                    self.pageaction.quitBrowser()
                finally:
                    self.parseexcel.wb.save(self.testdata_path)
                    logger.info('用例测试结束')
                    print('用例测试结束')
        except Exception as e:
            print(e)
            # 异常结束时,关闭文件流
            self.parseexcel.wb.close()
Esempio n. 8
0
 def __init__(self, filename):
     self.filename = filename
     self.parseyaml = ParseYaml()
     # 读取excel文件
     self.wb = load_workbook(self.filename)