Esempio n. 1
0
def login(info_list, test_err=False):
    logger.info('Web正在登录')
    login_page.input_corpId = info_list[0]
    login_page.input_username = info_list[1]
    login_page.input_password = info_list[2]
    login_page.btn_login.click()
    if not test_err:
        PageWait(login_page.menu_managementCenter)
        logger.info('Web登录完成')
Esempio n. 2
0
def logout():
    logger.info('Web正在退出登录')
    if login_page.btn_logout.is_displayed():
        login_page.btn_logout.click()
    else:
        login_page.btn_role.click()
        sleep(1)
        login_page.btn_logout.click()
    PageWait(login_page.btn_login)
    sleep(3)
    logger.info('Web退出登录完成')
Esempio n. 3
0
 def tap(self, elem=None, x=0, y=0, count=1):
     """
     appium API
     Perform a tap action on the element
     """
     self.switch_to_app()
     if elem:
         action = MobileTouchAction(self.driver)
         action.tap(elem, x, y, count).perform()
     else:
         self.driver.tap([(x, y)])
     logger.info('点击坐标(%d,%d)' % (x, y))
     self.switch_to_web()
Esempio n. 4
0
 def swipe_to_refresh(self, scale_up=0.25, scale_down=0.75):
     """
     用于app页面下拉刷新
     :param scale_up: 默认0.25,即起始y坐标为屏幕纵轴25%的地方
     :param scale_down: 默认0.25,即结束y坐标为屏幕纵轴75%的地方
     :return:
     """
     size = self.window_size
     width = size[0]
     height = size[1]
     middle_point_x = int(width * 0.5)
     up_point_y = int(height * scale_up)
     down_point_y = int(height * scale_down)
     logger.info('正在下拉刷新')
     self.switch_to_app()
     self.swipe(middle_point_x, up_point_y, middle_point_x, down_point_y)
     self.switch_to_web()
Esempio n. 5
0
def send_mail(host='',
              port='',
              user='',
              password='',
              sender_name='',
              to_addr='',
              cc_addr='',
              subject='',
              content='',
              content_html='',
              attach_file='',
              attach_file_name=''):
    logger.info('正在发送报告')
    # 连接邮件服务器
    server = smtplib.SMTP_SSL(host, port)
    server.login(user, password)

    msg = MIMEMultipart()
    if content:
        msg.attach(MIMEText(content, 'plain', 'utf-8'))  # 邮件正文
    if content_html:
        msg.attach(
            MIMEText(
                open(content_html, encoding='utf-8').read(), 'html',
                'utf-8'))  # 邮件正文,html格式
    msg.add_header('From', _format_addr('%s<%s>' % (sender_name, user)))  # 发送人
    msg.add_header('To', ','.join(to_addr))  # 收件人
    msg.add_header('Cc', ','.join(cc_addr))  # 抄送人
    msg.add_header('Subject', subject)  # 邮件主题
    # msg['Subject'] = Header(subject, 'utf-8').encode()
    if attach_file:
        # att2 = MIMEText(open(attach_file, encoding='utf-8').read(), 'base64', 'utf-8')
        att_f = MIMEApplication(open(attach_file, 'rb').read())
        att_f["Content-Type"] = 'application/octet-stream'
        # att_f["Content-Disposition"] = 'attachment; filename="report.zip"'
        att_f.add_header('Content-Disposition',
                         'attachment',
                         filename=('gb2312', '', attach_file_name))
        msg.attach(att_f)

    server.sendmail(from_addr=user,
                    to_addrs=to_addr + cc_addr,
                    msg=msg.as_string())
    server.quit()
    logger.info('报告已发送')
Esempio n. 6
0
 def start(self,
           headless=False,
           window_size='1920,1080',
           maximize_window=True,
           implicitly_wait=1):
     """
     打开web
     :param headless: 无头模式,默认关闭,当前只支持chrome
     :param window_size: 浏览器分辨率,默认为"1920,1080"
     :param maximize_window: 最大化窗口,默认开启
     :param implicitly_wait: 隐式等待时间,默认1秒
     :return: driver
     """
     if self.browser_name == "chrome":
         options = wdriver.ChromeOptions()
         # 无头模式
         if bool(headless):
             options.add_argument('--headless')
         # 分辨率
         options.add_argument(f'--window-size={window_size}')
         # 打开浏览器
         driver = wdriver.Chrome(executable_path=auto_chromedriver(
             self.get_chrome_version()),
                                 options=options)
         # 最大化窗口
         if bool(maximize_window):
             driver.maximize_window()
         # 隐式等待
         driver.implicitly_wait(implicitly_wait)
         logger.info("Starting Chrome browser.")
     # elif self.browser_name == "firefox":
     #     driver = wdriver.Firefox()
     #     logger.info("Starting Firefox browser.")
     #     return driver
     # elif self.browser_name == "ie":
     #     driver = wdriver.Ie()
     #     logger.info("Starting IE browser.")
     #     return driver
     else:
         raise Exception('当前只支持Chrome')
     # 打开初始化页面
     if self.init_url:
         driver.get(self.init_url)
         sleep(1)
     self.driver = driver
Esempio n. 7
0
 def page_ready(self, timeout=5):
     """
     判断页面是否加载完成
     :param timeout: 超时时间
     :return:
     """
     js = 'return window.document.readyState;'
     for i in range(timeout):
         try:
             page_state = self.driver.execute_script(js)
         except Exception as e:
             print(e)
             continue
         if page_state == 'complete':
             logger.info('页面加载完成')
             sleep(1)
             break
         sleep(1)
     else:
         logger.info('页面未加载完成')
Esempio n. 8
0
 def switch_to_window(self, handle, mode='web'):
     """
     selenium API
     Switches focus to the specified window.
     """
     if mode == 'web':
         logger.info('web切换窗口')
         self.driver.switch_to.window(handle)
     elif mode == 'app':
         logger.info('app切换窗口')
         try:  # app一般很少出现多窗口,这里的处理是避免app多窗口切换时出现异常
             self.driver.switch_to.window(handle)
             self.switch_to_app()
             self.switch_to_web()
             self.driver.switch_to.window(handle)
         except Exception as e:
             logger.error(e)
             if 'unable to connect to renderer' in str(e):
                 self.switch_to_app()
                 self.switch_to_web()
                 self.driver.switch_to.window(handle)
     else:
         raise Exception('mode只支持web或app')
Esempio n. 9
0
def zip_report(file_dirs, save_name):
    logger.info('正在压缩文件')
    logger.info(str(file_dirs))
    file_list = []
    file_list = catch_all_files(file_dirs, file_list)
    for i in file_list:
        print(i)
    z_file = ZipFile(save_name, 'w', compression=ZIP_DEFLATED)
    for i in file_list:
        # print(i)
        base_name = i.split('report')[1]
        z_file.write(i, arcname=base_name)
    z_file.close()
    logger.info('压缩完成')
Esempio n. 10
0
def install_app(driver, device, app_pkg):
    # 手机是否已安装app,未安装则直接安装
    apk = ApkInfo(app_pkg)
    pkg_name = apk.get_package_name()
    installed_pkg = adb_command(device, 'shell pm list package', False)
    if pkg_name not in installed_pkg:
        logger.info('app未安装,正在安装')
        Thread(target=loop_accept_alert, args=[driver]).start()  # 启动多线程处理弹框
        adb_command(device, 'install --no-streaming %s' % app_pkg)
        logger.info('app安装完成')
        return
    # 已安装与待安装的app版本号是否一致,不一致则卸载重装
    new_version = apk.get_version_code()
    old_version = re.findall(
        r'versionCode=(\d+)',
        adb_command(device, 'shell dumpsys package %s' % pkg_name, False))[0]
    logger.info('新版本号:%s 旧版本号:%s' % (new_version, old_version))
    if new_version != old_version:
        logger.info('app版本号不一致,卸载重装')
        adb_command(device, 'uninstall %s' % pkg_name)
        Thread(target=loop_accept_alert, args=[driver]).start()  # 启动多线程处理弹框
        adb_command(device, 'install --no-streaming %s' % app_pkg)
        logger.info('app安装完成')
        return
    logger.info('app已安装,无需安装')
Esempio n. 11
0
 def update(self, sql_string):
     logger.info('执行sql:%s' % sql_string)
     self.cursor.execute(sql_string)
     result = self.cursor.fetchall()
     logger.info(result)
     self.conn.commit()
Esempio n. 12
0
 def query(self, sql_string, row=0, col=0):
     logger.info('执行sql:%s' % sql_string)
     self.cursor.execute(sql_string)
     result = self.cursor.fetchall()
     logger.info(result)
     return result[row][col]
Esempio n. 13
0
    def create_overview(self, title, h_files, save_file):
        logger.info('正在生成概览报告')
        # 提取结果文件的运行结果
        pass_num = skip_num = fail_num = error_num = xfailed_num = xpassed_num = rerun_num = total_num = 0
        case_result_elems = []
        if not isinstance(h_files, list):
            h_files = [h_files]
        for f in h_files:
            file2 = open(f, encoding="utf-8")
            r_file = parse(file2)
            # 提取结果文件的汇总数量
            pass_num += self.get_num(r_file.find('//*[@class="passed"]').text)
            skip_num += self.get_num(r_file.find('//*[@class="skipped"]').text)
            fail_num += self.get_num(r_file.find('//*[@class="failed"]').text)
            error_num += self.get_num(r_file.find('//*[@class="error"]').text)
            xfailed_num += self.get_num(
                r_file.find('//*[@class="xfailed"]').text)
            xpassed_num += self.get_num(
                r_file.find('//*[@class="xpassed"]').text)
            try:
                rerun_num += self.get_num(
                    r_file.find('//*[@class="rerun"]').text)
            except:
                pass
            # 结果文件表格
            r_table_elem = r_file.find('//*[@id="results-table"]')
            # 遍历结果文件的所有用例结果,并加入到模板文件的表格中
            case_result_elems += r_table_elem.xpath('./tbody/tr[1]')
        # 统计通过率
        total_num = pass_num + skip_num + fail_num + error_num + xfailed_num + xpassed_num
        self.pass_rate = '{:.1%}'.format(pass_num / total_num)

        file1 = open(self.template_file, encoding="utf-8")
        t_file = parse(file1)

        # 将汇总数量填充到模板文件
        t_file.find('//*[@class="passed"]').text = self.replace_num(
            t_file.find('//*[@class="passed"]').text, str(pass_num))
        t_file.find('//*[@class="skipped"]').text = self.replace_num(
            t_file.find('//*[@class="skipped"]').text, str(skip_num))
        t_file.find('//*[@class="failed"]').text = self.replace_num(
            t_file.find('//*[@class="failed"]').text, str(fail_num))
        t_file.find('//*[@class="error"]').text = self.replace_num(
            t_file.find('//*[@class="error"]').text, str(error_num))
        t_file.find('//*[@class="xfailed"]').text = self.replace_num(
            t_file.find('//*[@class="xfailed"]').text, str(xfailed_num))
        t_file.find('//*[@class="xpassed"]').text = self.replace_num(
            t_file.find('//*[@class="xpassed"]').text, str(xpassed_num))
        try:
            t_file.find('//*[@class="rerun"]').text = self.replace_num(
                t_file.find('//*[@class="rerun"]').text, str(rerun_num))
        except:
            pass

        # 将用例结果填充到模板文件
        t_table_elem = t_file.find('//*[@id="results-table"]')
        for case_result in case_result_elems:
            t_table_elem.append(case_result)
        # 修改标题
        t_file.find('//h1').text = title
        # 文件写入
        t_file.write(save_file)
        print('已生成概览报告')
Esempio n. 14
0
 def refresh(self):
     logger.info('刷新页面')
     self.driver.refresh()
     self.page_ready()
     logger.info('页面刷新完成')