def type(self): if self.device != "null": self.log = log(logname=self.device + "-" + self.system, system=self.system) else: self.log = log(logname=self.browser + "-" + self.system, system=self.system) if self.browser != "null": self.browser_type() self.open_browser() else: # 执行机信息 capabilities = get_config_info(self.device, key=None, filename="devices_info.ini") # 应用信息 app = get_config_info(self.system, key=None, filename="app_info.ini") capabilities['appPackage'] = app["appPackage"] capabilities['appActivity'] = app["appActivity"] from appium import webdriver self.driver = webdriver.Remote( get_config_info("appiumGrid", key="host", filename="config.ini"), capabilities)
def test_1(self): # 实验多进程 dict = get_config_info("exec", filename="/devices_info.ini") for k, v in dict.items(): p = multiprocessing.Process(target=Test().t_01, args=(v, )) print("运行用例01,执行机:{},进程名称是:{}".format(v, p.name)) p.start()
def open_browser(self): """ 打开URL设置窗口最大化并等待全部元素加载完成 """ self.driver.get(get_config_info(self.system, "URL")) self.driver.maximize_window() self.driver.implicitly_wait(self.timeout)
def send_test_report(title, case_count): """ 以附件方式把最新的测试报告发送给指定的人,发件人邮箱信息、接收人的邮箱信息、 测试报告的最大数量都可以在config/configInfo.ini文件中配置 :param case_count: 系统的测试场景个数 :param title: 邮件标题 """ # 控制报告的数量以及返回最新的测试报告 report_path = path.TEST_REPORT lists = os.listdir(report_path) # 返回list lists.sort(key=lambda a: os.path.getatime(report_path + '/' + a)) # 以时间排序 file_path = os.path.join(report_path, lists[-1]) # 返回测试报告路径 count = os.listdir(report_path) if len(count) > int(get_config_info("Report_quantity", "quantity")): count.sort() ph = report_path + "/" + count[0] os.remove(ph) # 读取配置文件中的接收者邮箱地址 mail = [] data = get_config_info("Acceptor") for i in data: mail.append(data[i]) s_server = 'smtp.163.com' # 定义邮箱服务 user = get_config_info("Mail", "username") # 读取配置文件的用户名 password = get_config_info("Mail", "password") # 读取配置文件的密码(授权密码) msg_total = MIMEMultipart() # 定义类型 # multipart类型主要有三种子类型:mixed、alternative、related 默认mixed msg_total['From'] = user # 发送方邮箱 msg_total['To'] = ','.join(mail) # 接受者邮箱 msg_total['Subject'] = title # 邮件的标题 # 正文模块 # msg_raw = open(file_path, "r", encoding='utf-8').read() # 打开要发送的测试报告 msg_raw = email_temp(title, case_count, file_path) msg = MIMEText(msg_raw, 'html', "utf-8") msg_total.attach(msg) # 附件模块 mfile = MIMEApplication(open(file_path, "rb").read()) # 读取测试报告内容 mfile.add_header('Content-Disposition', 'attachment', filename=file_path) # 添加附件的头信息 # 添加附件 msg_total.attach(mfile) smtp = smtplib.SMTP_SSL(s_server, 465) smtp.login(user, password) smtp.sendmail(user, mail, msg_total.as_string()) smtp.quit()
def driver(section, appName, url="http://127.0.0.1:4444/wd/hub"): """ :param appInfo: 配置文件中应用名 :param callAddress: 调用地址 :param section: 配置文件的节(执行机信息) :return: """ #执行机信息 capabilities = get_config_info(section, key=None, filename="/devices_info.ini") #应用信息 app = get_config_info(appName, key=None, filename="/app_info.ini") capabilities['appPackage'] = app["appPackage"] capabilities['appActivity'] = app["appActivity"] driver = webdriver.Remote(url, capabilities) return driver
def browser_type(self): """ 根据参数“browser”判断要启动的执行机的类型后启动对应的执行机 """ if self.browser == "firefox": option = webdriver.FirefoxProfile() # 其中plugin.state.flash后的数值可以为0,1,2; 0:禁止,1:询问,2:允许。 option.set_preference('plugin.state.flash', 2) self.host = get_config_info("seleniumGrid", "host") self.driver = webdriver.Remote(command_executor=self.host, desired_capabilities={ 'platform': 'ANY', 'browserName': 'firefox', 'version': "", 'javascriptEnabled': True }, browser_profile=option) elif self.browser == "ie": self.host = get_config_info("seleniumGrid", "host") self.driver = webdriver.Remote(command_executor=self.host, desired_capabilities={ 'platform': 'ANY', 'browserName': 'internet explorer', 'version': "", 'javascriptEnabled': True }) elif self.browser == "chrome": self.host = get_config_info("seleniumGrid", "host") self.driver = webdriver.Remote(command_executor=self.host, desired_capabilities={ 'platform': 'ANY', 'browserName': 'chrome', 'version': "", 'javascriptEnabled': True }) else: pass
for k, v in dict.items(): p = multiprocessing.Process(target=Test().t_01, args=(v, )) print("运行用例01,执行机:{},进程名称是:{}".format(v, p.name)) p.start() if __name__ == '__main__': # 获取类中所有的方法(自定义方法) ''' 1、获取类中所有的方法 2、多进程调用方法。调用方法时遍历执行设备列表实现多线程 问题:会同事启动多个进程,导致appium混乱。 解决思路:将一个用例下的所有进程加入到列表,启动下次循环时判断上一组进程是否全部结束。结束则运行下一个用例。否则等待进程结束 ''' # 获取类中所有的方法 list = dir(Test) list1 = [] for i in list: if "test_" in i: ii = list.index(i) list1.append(list[ii]) # 遍历测试用例和执行设备列表。多线程执行 dict = get_config_info("exec", filename="/devices_info.ini") for i in list1: cmd = "Test()" + "." + i for k, v in dict.items(): p = multiprocessing.Process(target=eval(cmd), args=(v, )) print("运行用例02,执行机:{},进程名称是:{}".format(v, p.name)) p.start()