def save_excel(self): try: self.target.save(self.targetName) return True except: Base.printErr("保存Excel文件失败!") return False
def v_login(self, status, expectUser, expectInfo): rc = "" try: if status: #如果登录的期望结果是成功的 #从登陆成功的界面上获取用户名 userLogin = self.driver.find_element_by_css_selector\ ("ul[class='nav navbar-nav']>li>a").text #如果从界面上获取的用户名和期望的用户名相等 if userLogin == expectUser: rc = "PASS--登录成功:" + expectUser #返回验证成功信息 else: #返回验证失败信息 rc = "FAIL--登录错误,期望用户为‘%s’,实际用户为‘%s’"\ %(expectUser,userLogin) else: #如果登录的期望结果是失败的 #获取登录失败提示框中的提示信息 errBoxMsg = self.driver.find_element_by_class_name( "bootbox-body").text #如果界面上获取的错误提示信息和期望的错误提示信息相等 if errBoxMsg == expectInfo: rc = "PASS--预期的登录错误提示信息验证成功!" #返回验证成功信息 else: #否则不相等 #返回验证失败信息 rc = "FAIL--登录验证失败,期望错误信息为‘%s’,实际错误信息为‘%s’" \ %(expectInfo,errBoxMsg) except: Base.printErr("ERR--v_login方法验证登陆时失败") return rc #raise rc self.close_driver() #关闭浏览器 return rc #将验证成功、失败、错误等信息返回给调用者
def write_by_index(self, row, col, page, value): try: self.target.get_sheet(page).write(row, col, value) return True except: Base.printErr("按行列号写入Excel文件失败!") return False
def str_parse_func(self, source): try: if source[0:1] == "$": source = source[1:] else: return source #func = "sql.delProduct(测试产品,服务类)" m = source.split(".") if len(m) == 2: n = m[1].split("(") if len(n) == 2: v = self.get_list_value(m[0], n[0]) n[1] = n[1].strip(" ") n[1] = n[1].strip(")") n[1] = n[1].strip() xx = n[1].split(",") yy = [] for x in xx: x = x.strip() yy.append(x) s = self.str_fill_parm(v, yy) return s raise RuntimeError("字符串格式错误:%s" % source) except: Base.printErr("解析函数字符串失败!")
def close_driver(self): try: self.driver.close() return True except: Base.printErr("浏览器对象不存在!") return False
def openCrm(self): try: self.driver.switch_to.default_content() self.driver.find_element_by_xpath("//li[@id='s-menu-1']//button").click() self.driver.switch_to.frame("iframe-1")#要点击“产品”先进入frame return True except: Base.printErr("打开CRM框架失败!") return False
def open_excel(self): try: if not self.data: self.data = xlrd.open_workbook(self.file) self.target = copy(self.data) return True except: Base.printErr("打开Excel文件失败!") return False
def str_fill_parm(self, source, vars): try: if source.find("?") < 0: #如果没有需要替换的参数则直接返回源字串 return source for var in vars: source = source.replace("?", "%s", 1) source = source % (var) return source except: Base.printErr("参数替换失败!")
def open_driver(self): try: fp = webdriver.FirefoxProfile( Base.get_cur_dir(__file__) + "\\..\\firefoxPro") self.driver = webdriver.Firefox(fp) #打开火狐 self.driver.maximize_window() #最大化窗口 self.driver.implicitly_wait(10) #隐式等待10秒 return True except: Base.printErr("打开或设置浏览器失败!") return False
def open_driver(self): try: fp = webdriver.FirefoxProfile("..\\firefoxpro") self.driver = webdriver.Firefox(fp) #打开火狐 self.driver.maximize_window() #最大化窗口 self.driver.implicitly_wait(10) #隐式等待10秒 self.driver.get(self.url) #打开首页url return True except: Base.printErr("打开或设置浏览器失败!") return False
def get_page_data(self, page): try: if not self.open_excel(): return None table = self.data.sheet_by_name(page) nrows = table.nrows #行数 lists = [] for num in range(0, nrows): row = table.row_values(num) if row: lists.append(row) return lists except: Base.printErr("打开Excel中用例数据失败!")
def get_list_value(self, page, name): try: if not self.open_excel(): return None table = self.data.sheet_by_name(page) nrows = table.nrows #行数 for num in range(0, nrows): row = table.row_values(num) if row: if row[0] == name: return row[1] return None except: Base.printErr("获取Excel中键值对信息失败!")
def __init__(self, file): #一个软件只有一个工作路径,所以当有可能从不同的入口执行时,需要获取当前的绝对路径,再去查找相对路径 self.file = Base.get_cur_dir( __file__) + "\\" + file #永远是基于excel.py所在路径 self.targetName = self.file.replace( ".xlsx", (time.strftime("%Y-%m-%d-%H-%M-%S") + ".xlsx")) self.data = None
def log_in(self, username, password): if self.open_from_excel() == False: #根据excel中的url打开浏览器 return None sleep(1) #等待1秒(可选) try: self.driver.find_element_by_id("account").send_keys( username) #定位到用户名字段并输入用户名 self.driver.find_element_by_id("password").send_keys( password) #定位到密码字段并输入密码 self.driver.find_element_by_id("submit").click() #点击登录按钮 sleep(1) return self.driver except: Base.printErr("ERR--log_in方法中登录然之操作失败.") return None
def init_screenshot_dir(): rootLogDir = Base.get_cur_dir(__file__) currentLogDirName = time.strftime('%Y-%m-%d-%H_%M_%S', time.localtime(time.time())) currentTimeStampLogDir = os.path.join(rootLogDir, currentLogDirName) os.mkdir(currentTimeStampLogDir) return currentTimeStampLogDir
def get_config_item(self, page, group, items): try: if not self.open_excel(): return None table = self.data.sheet_by_name(page) nrows = table.nrows #行数 bFound = False for num in range(0, nrows): row = table.row_values(num) if row: if row[0] == '[%s]' % group: bFound = True continue elif row[0][0:1] == "[": bFound = False if bFound: for key in items.keys(): if key == row[0]: items[key] = row[1] return items except: Base.printErr("获取Excel中配置信息失败!")
def submit_success(self, pkg_info): try: pkg_name, pkg_version = self.click_check_link(pkg_info) self.driver.find_element_by_xpath("//button[text()='提交']").click() WebDriverWait(self.driver, 20, 0.5).until( lambda x: x.find_element_by_xpath("//div[text()='提交成功']")) sleep(3) # submit_rs = self.driver.find_element_by_xpath("//div[text()='提交成功']") # submit_txt = submit_rs.text # logger.info("submit_txt = '" + submit_txt + "'") logger.info("'" + pkg_name + "'审核通过!") except: logger.error( Base.printErr("pkg_name=" + pkg_name + " & " + pkg_version + " 审核失败!")) self.screen_shot("审核通过")
def submit_faile(self, pkg_info): try: pkg_name, pkg_version = self.click_check_link(pkg_info) self.driver.find_element_by_id("combox_result_id").click() self.driver.find_element_by_xpath("//a[text()='不通过']").click() self.driver.find_element_by_id("combox_reason_id").click() self.driver.find_element_by_xpath( "//a[text()='应用无法正常运行或功能存在问题']").click() self.driver.find_element_by_id("remarks").send_keys("自动化测试") self.driver.find_element_by_xpath("//button[text()='提交']").click() WebDriverWait(self.driver, 20, 0.5).until( lambda x: x.find_element_by_xpath("//div[text()='提交成功']")) sleep(3) logger.error("‘" + pkg_name + "'审核不通过!") except: logger.error( Base.printErr("pkg_name=" + pkg_name + " & " + pkg_version + " 审核失败!")) self.screen_shot("审核不通过")
def launch_app(self): try: self.d.screen_on() self.d.unlock() # self.d.app_start(AGILEAPP) # self.d(scrollable=True).scroll.to(text=self.app_name) # self.d(text=self.app_name).sibling(resourceId=AGILEAPP+":id/launch").click() cmd = "adb -s " + self.serial + " shell am start -a com.gionee.agileapp.action.LAUNCH -e EXTRA_APP " + self.app_name logger.info(cmd) cmd_str = Util.exccmd(cmd) logger.info(cmd_str) time.sleep(5) self.d(packageName=AGILEAPP, className=ANDROID_VIEW_VIEW).wait() logger.info("启动'" + self.app_name + "'成功") except: logger.error(Base.printErr("启动'" + self.app_name + "'失败!!!")) currentStamp = time.strftime('%Y-%m-%d-%H_%M_%S', time.localtime(time.time())) self.d.screenshot(self.currentTimeStampLogDir + os.sep + currentStamp + ".jpg")
def syn_server(self, pkg_info): try: pkg_name = pkg_info[1] pkg_id = pkg_info[0] pkg_version = pkg_info[2] self.driver.find_element_by_name("_search[rpkPackage]").send_keys( pkg_name) Select(self.driver.find_element_by_id( "rpk_status")).select_by_visible_text("已上架") self.driver.find_element_by_id("veryfy2_sub").click() sleep(2) self.click_syn_link(pkg_id) for i in range(3): if self.syn_fail_again_syn(pkg_id): break sleep(3) logger.info("'" + pkg_name + "'同步成功!") except: logger.error( Base.printErr("pkg_name=" + pkg_name + " & " + pkg_version + " 同步失败!")) self.screen_shot("同步")
from suite.product_suite import ProductSuite from suite.contact_suite import ContactSuite class RanzhiTestRunner(): def run_tests(self): # 创建一个测试套件 test_suite = unittest.TestSuite() # 在测试套件中添加需要运行的测试用例 test_suite = LoginSuite(test_suite).add_tests() test_suite = ProductSuite(test_suite).add_tests() test_suite = ContactSuite(test_suite).add_tests() # 创建一个文本测试运行器,运行刚刚创建的测试套件 #text_test_runner = unittest.TextTestRunner() #text_test_runner.run(test_suite) #用开源代码HtmlTestRunner运行测试套件并生成测试报告 self.reportFile = "report\\test_result_%s.html"%time.strftime("%Y-%m-%d-%H-%M-%S") report = open(self.reportFile, "wb") #用w方式打开文件,如果文件不存在则会默认创建 html_test_runner = HtmlTestRunner(report, title="然之协同办公系统自动化测试结果", description="测试然之功能的详细自动化测试结果") html_test_runner.run(test_suite) report.close() if __name__ == "__main__": test_runner = RanzhiTestRunner() test_runner.run_tests() Base.send_email("*****@*****.**", test_runner.reportFile)
# 审核通过 rzLogin.submit_success(pkg_info) rzLogin.close_browser() # 同步 rzLogin = sucess_login(screenshot_dir) print("开始同步") print(pkg_info) print(pkg_name) rzLogin.syn_server(pkg_info) else: rzLogin.submit_faile(pkg_info) rzLogin.close_browser() except: logger.error( Base.printErr("pkg_name=" + pkg_name + " & " + pkg_version + " 测试失败!")) rzLogin = sucess_login(screenshot_dir) is_has_need_check_app = rzLogin.has_need_check_app() rzLogin.close_browser() if not is_has_need_check_app: break i += 1 cmd = "adb -s " + serial + " shell date +%s" end_stamp = Util.exccmd(cmd) logger.info("end_stamp=" + end_stamp) dump_info = dump_crash_info(serial, int(start_stamp), int(end_stamp)) filename = screenshot_dir + os.sep + 'crash_data.txt' with open(filename, 'w') as f: # 如果filename不存在会自动创建, 'w'表示写数据,写之前会清空文件中的原有数据! f.write(dump_info)
# -*- coding: utf-8 -*- import uiautomator2 as u2 from function.utils import Util from function.base.base import Base import os, time import xml.etree.ElementTree as ET AGILEAPP = "com.gionee.agileapp" __author__ = 'suse' device = "IZEAMF6LLJVSLNQC" rootLogDir = Base.get_cur_dir(__file__) currentLogDirName = time.strftime('%Y-%m-%d-%H_%M_%S', time.localtime(time.time())) currentTimeStampLogDir = os.path.join(rootLogDir, currentLogDirName) os.mkdir(currentTimeStampLogDir) d = u2.connect_usb(device) d.app_start(AGILEAPP) d(scrollable=True).scroll.to(text="看了吗") d(text="看了吗").sibling(resourceId="com.gionee.agileapp:id/launch").click() d(packageName="com.gionee.agileapp", className="android.view.View").wait() xml = d.dump_hierarchy() # print(xml) root = ET.fromstring(xml) print(xml) # nodes = root.findall(".//*[@package='com.gionee.agileapp']/node") for node in root.findall(".//*[@package='com.gionee.agileapp']/node"): className = node.get("class") # childNode = node.find("..//*[@class='android.view.View']/node") if (className == "android.view.View"): d.app_start(AGILEAPP) d(scrollable=True).scroll.to(text="看了吗")
class RanzhiTestRunner(): def run_tests(self): # 创建一个测试套件 test_suite = unittest.TestSuite() # 在测试套件中添加需要运行的测试用例 test_suite = LoginSuite(test_suite).add_tests() test_suite = ProductSuite(test_suite).add_tests() test_suite = ContactSuite(test_suite).add_tests() # 创建一个文本测试运行器,运行刚刚创建的测试套件 #text_test_runner = unittest.TextTestRunner() #text_test_runner.run(test_suite) #用开源代码HtmlTestRunner运行测试套件并生成测试报告 self.reportFile = "report\\test_result_%s.html" % time.strftime( "%Y-%m-%d-%H-%M-%S") report = open(self.reportFile, "wb") #用w方式打开文件,如果文件不存在则会默认创建 html_test_runner = HtmlTestRunner(report, title="然之协同办公系统自动化测试结果", description="测试然之功能的详细自动化测试结果") html_test_runner.run(test_suite) report.close() if __name__ == "__main__": test_runner = RanzhiTestRunner() test_runner.run_tests() Base.send_email("*****@*****.**", test_runner.reportFile)