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登录完成')
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退出登录完成')
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()
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()
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('报告已发送')
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
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('页面未加载完成')
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')
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('压缩完成')
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已安装,无需安装')
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()
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]
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('已生成概览报告')
def refresh(self): logger.info('刷新页面') self.driver.refresh() self.page_ready() logger.info('页面刷新完成')