def run_main(self, run_case_type=None): #系统版本 plat = platform.system() plat_ver = platform.version() log.info("plat_ver = %s" % plat_ver) #根据参数 获取测试套件 if run_case_type == '2': ts = self.get_case_suit() elif run_case_type == '1' or run_case_type == None: ts = self.get_all_testcase() else: log.info("用例范围参数错误,应该为空,1,2") report_name = self.set_report_name() # 打开report.html文件 fp = open(report_name, "wb") #执行用例 runner = HTMLTestRunner(fp, title="WEBUI自动化测试报告", description="环境:%s %s 浏览器:%s" % (plat, plat_ver, sys.argv[1])) result = runner.run(ts) option = "%s_success_count" % sys.argv[1] self.write_ini_file("count", option, result.success_count) option = "%s_failure_count" % sys.argv[1] self.write_ini_file("count", option, result.failure_count) option = "%s_error_count" % sys.argv[1] self.write_ini_file("count", option, result.error_count) #关闭文件句柄 fp.close()
def get_value(key, defValue=None): """ 获得一个全局变量,不存在则返回默认值 """ try: log.info("key = %s,value=%s" % (key, _global_dict[key])) return _global_dict[key] except: KeyError
def get_login_success_element(self): flag = False element = self.find_element( "xpath", '//*[@id="app"]/div/div[1]/div/div[2]/div/div/div[2]') log.info("element = %s" % element) if element != None: self.get_screenshot() flag = True return flag
def get_username_or_password_error(self): flag = False error_element = self.find_element("xpath", '/html/body/div[2]/p') log.info("error_element = %s" % error_element) log.info("error_element.text= %s" % error_element.text) if error_element.text == "用户密码错误": self.get_screenshot() flag = True return flag
def get_all_row_data(self): nrows = self.get_row_count() log.info("nrows=%s" % nrows) data = [] for row in range(1, nrows): row_data = self.get_row_value(row) data.append(row_data) log.info("data=%s" % data) return data
def get_input_usr_tips(self): flag = False error_element = self.find_element( "xpath", '//*[@id="app"]/div/form/div[2]/div[2]/div/div[2]') log.info("error_element = %s" % error_element) log.info("error_element.text= %s" % error_element.text) if error_element.text == "请输入用户名": self.get_screenshot() flag = True return flag
def open_login_page(self, broswer_type=None): self.cf = GetConfigData() #获取config文件中的url self.link = self.cf.get_data("test_env", "url") #打开浏览器 driver = self.open_broswer(broswer_type) #拼接指定页面的url url = self.link + "#/login" #打开指定页面 self.open_url(driver, url) log.info("open url=%s" % url)
def test_1(self,username,password): self.lp.login(username,password) log.info(unittest.TestCase.id(self).split(".")[2].split("___")[0]) #根据每个用例设定断言 #第一个用例 登录成功 if unittest.TestCase.id(self).split(".")[2].split("___")[0] == "test_1_1": result = self.lp.get_login_success_element() self.assertTrue(result) # 第二个用例 登录失败,提示用户名密码错误 elif unittest.TestCase.id(self).split(".")[2].split("___")[0] == "test_1_2": error = self.lp.get_username_or_password_error() self.assertTrue(error)
def get_screenshot(self): #获取调用该函数的函数名 func_name = traceback.extract_stack()[-2][2] day = get_cur_date() #截图文件路径 dir = os.path.join(get_project_dir(), "ScreenShot", day, sys.argv[1]) if not os.path.exists(dir): os.makedirs(dir) else: log.info("%s 文件夹已存在" % dir) #截图文件命名 调用函数+日期.png filename = dir + "\\" + func_name + "_" + get_cur_date() + ".png" log.info("filename=%s" % filename) self.driver.save_screenshot(filename)
def send_mail(self,report_name,success_case_count,failure_case_count): #获取mail的配置信息 self.get_mail_config() #创建一个带附件的实例 message = MIMEMultipart() subject = " WEBUI自动化测试结果" message['Subject']=subject message['from']=self.from_addr message['to'] = self.to_addrs #邮件正文内容 total_case_count = success_case_count + failure_case_count context = "共测试%d个用例,成功%d个,失败%d个。\n具体测试结果见附件。"%(total_case_count,success_case_count,failure_case_count) message.attach(MIMEText(context)) #构造附件1 att1 = MIMEText(open(report_name,"rb").read(),"base64","utf-8") send_file_name = report_name.split("/")[-1] log.info("send_file_name=%s"%send_file_name) att1["Content-Type"] = 'application/octet-stream' att1["Content-Disposition"] = 'attachment; filename="%s"'%send_file_name message.attach(att1) try: self.st = smtplib.SMTP() self.st.connect(host=self.mail_host) log.info("self.mail_usr=%s,self.mail_psw=%s"%(self.mail_usr,self.mail_psw)) self.st.login(self.mail_usr,self.mail_psw) self.st.sendmail(self.from_addr,self.to_addrs.split(";"), message.as_string()) log.info("send email success") except: log.info("send email fail")
def find_element(self, by, locator): try: if by == "id": log.info("by=%s,locator=%s" % (by, locator)) wait = WebDriverWait(self.driver, 10, 1) lt = (By.ID, locator) wait.until(ec.visibility_of_element_located(lt)) element = self.driver.find_element_by_id(locator) elif by == "xpath": log.info("by=%s,locator=%s" % (by, locator)) wait = WebDriverWait(self.driver, 10, 1) lt = (By.XPATH, locator) wait.until(ec.visibility_of_element_located(lt)) element = self.driver.find_element_by_xpath(locator) except: element = None return element
def open_broswer(self, broswer_type=None): #未传浏览器类型,默认打开谷歌浏览器 if broswer_type == None: driver = webdriver.Chrome() else: #打开谷歌浏览器 if broswer_type == 'chrome': driver = webdriver.Chrome() # 打开火狐浏览器 elif broswer_type == 'firefox': driver = webdriver.Firefox() # 打开IE浏览器 elif broswer_type == 'ie': driver = webdriver.Ie() else: # 参数错误,提示不支持 log.info("not support broswer type") driver.maximize_window() self.driver = driver return driver
def get_case_suit(self): #定义测试套件 test_suit = unittest.TestSuite() #获取case_list设定的用例 case_list = self.get_case_list() #获取测试用例路径 dir_name = os.path.abspath(os.path.dirname(os.getcwd())) test_case_dir = os.path.join(dir_name, "TestCase") log.info("test_case_dir=%s" % test_case_dir) st = [] #查找出case_list中设定的用例文件 for case in case_list: discover = unittest.defaultTestLoader.discover(test_case_dir, case) st.append(discover) # 把case_list设定的用例文件中的测试用例添加到测试套件中 for suit in st: for test_name in suit: test_suit.addTest(test_name) return test_suit
def test_2(self, username, password): self.lp.login(username, password) log.info(unittest.TestCase.id(self).split(".")[2].split("___")[0]) # 根据每个用例设定断言 # 第一个用例 登录成功 if unittest.TestCase.id(self).split(".")[2].split("___")[0] == "test_2_1": result = self.lp.get_login_success_element() self.assertTrue(result) # 第二个用例 登录失败,提示用户名密码错误 elif unittest.TestCase.id(self).split(".")[2].split("___")[0] == "test_2_2": error = self.lp.get_username_or_password_error() self.assertTrue(error) # 第三个用例 登录失败,提示请输入密码 elif unittest.TestCase.id(self).split(".")[2].split("___")[0] == "test_2_3": error = self.lp.get_input_psw_tips() self.assertTrue(error) # 第四个用例 登录失败,提示请输入用户名 elif unittest.TestCase.id(self).split(".")[2].split("___")[0] == "test_2_4": error = self.lp.get_input_usr_tips() self.assertTrue(error)
def get_yaml_data(self, filename=None): if filename == None: filename = get_project_dir() + "\\YamlFile" + "\\test.yaml" log.info("filename=%s" % filename) fp = open(filename, encoding='utf-8') yaml_data = yaml.load(fp, Loader=yaml.FullLoader) log.info("yaml_data=%s" % yaml_data) log.info("yaml_data=%s" % yaml_data['test_env']['url'])
def set_report_name(self): broswer_type = sys.argv[1] day = datetime.now().strftime("%Y%m%d") case_name = os.path.basename(__file__).split(".")[0] # dir_name = os.path.abspath(os.path.dirname(os.getcwd())) + "\\Report" dir_name = os.path.join(os.path.abspath(os.path.dirname(os.getcwd())), "Report", day) log.info("dir_name=%s" % dir_name) file_exist = os.path.exists(dir_name) log.info("file_exist=%s" % file_exist) if not file_exist: os.makedirs(dir_name) else: log.info("dir_name = %s文件夹已存在" % dir_name) file_name = "report_" + case_name + "_" + day + "(" + broswer_type + ")" + ".html" report_name = os.path.join(dir_name, file_name) log.info("report_name = %s" % report_name) return report_name
class RunMain(unittest.TestCase): #获取所有测试用例 def get_all_testcase(self): dir_name = os.path.abspath(os.path.dirname(os.getcwd())) test_case_dir = os.path.join(dir_name, "TestCase") log.info("test_case_dir=%s" % test_case_dir) ts = unittest.defaultTestLoader.discover(test_case_dir, "*Test.py") return ts def set_report_name(self): broswer_type = sys.argv[1] day = datetime.now().strftime("%Y%m%d") case_name = os.path.basename(__file__).split(".")[0] # dir_name = os.path.abspath(os.path.dirname(os.getcwd())) + "\\Report" dir_name = os.path.join(os.path.abspath(os.path.dirname(os.getcwd())), "Report", day) log.info("dir_name=%s" % dir_name) file_exist = os.path.exists(dir_name) log.info("file_exist=%s" % file_exist) if not file_exist: os.makedirs(dir_name) else: log.info("dir_name = %s文件夹已存在" % dir_name) file_name = "report_" + case_name + "_" + day + "(" + broswer_type + ")" + ".html" report_name = os.path.join(dir_name, file_name) log.info("report_name = %s" % report_name) return report_name #获取case_list.txt中设定的用例 def get_case_list(self): cur_dir = os.path.os.getcwd() file_name = os.path.join(cur_dir, "case_list.txt") fp = open(file_name) case_list = [] for case in fp.readlines(): log.info("case=%s" % case) if case != '' and not case.startswith("#"): case_list.append(case.replace("\n", "")) log.info("case_list=%s", case_list) fp.close() return case_list
result = runner.run(ts) option = "%s_success_count" % sys.argv[1] self.write_ini_file("count", option, result.success_count) option = "%s_failure_count" % sys.argv[1] self.write_ini_file("count", option, result.failure_count) option = "%s_error_count" % sys.argv[1] self.write_ini_file("count", option, result.error_count) #关闭文件句柄 fp.close() #写data.ini文件 def write_ini_file(self, section, option, value): filename = os.path.join(get_project_dir(), "ConfigFile", "data.ini") cf = GetConfigData(filename) cf.add_setion(section) cf.add_option(section, option, str(value)) cf.write_ini() if __name__ == '__main__': if len(sys.argv) == 3: RunMain().run_main(sys.argv[2]) elif len(sys.argv) == 2: RunMain().run_main() else: log.info("参数个数错误")
def view_report(self): try: #点击查看报告/查看按钮 self.click_element( "xpath", '//*[@id ="app"]/div/div[3]/div[2]/div[1]/div[1]/div[1]/div[3]/button/span' ) log.info("click view_report btn") self.click_element( "xpath", '//*[@id="app"]/div/div[3]/div[2]/div[1]/div[1]/div[2]/table/tr[1]/td[5]/button/span' ) log.info("click view btn") #获取当前窗口句柄 cur_handle = self.lp.driver.current_window_handle log.info("cur_handle=%s" % cur_handle) # 获取所有窗口句柄 handles = self.lp.driver.window_handles log.info("handles=%s" % handles) # 切换到新的报告查看页面 for handle in handles: if handle != cur_handle: self.lp.driver.switch_to.window(handle) cur_handle = self.lp.driver.current_window_handle log.info("cur_handle2=%s" % cur_handle) #查找新标签页上的元素 element = self.find_element( "xpath", '//*[@id="publicOpinionAlert"]/div[1]') log.info("element=%s" % element) except: log.info("can not find element")
def get_page_company_count(self): element = self.find_element("xpath", '//*[@id="app"]/div/div[3]/div[1]') count = element.text.split(" ")[1] log.info("count=%s" % count) return int(count)
def get_db_company_count(self): db = GetDBData() sql = "select count(distinct company_id) from b_rpt_report r where r.report_type='1';" data = db.select_db(sql) log.info("db data=%s" % data) return int(data[0][0])
def test_3(self): self.lp.login("nbyh_admin","123456") result = self.lp.get_login_success_element() log.info("result = %s"%result) self.assertTrue(result)
def setUpClass(cls): cls.sp = SearchPage() broswer_type = sys.argv[1] log.info("broswer_type=%s" % broswer_type) cls.sp.open_search_page(broswer_type) cls.driver = cls.sp.driver
def setUp(self): broswer_type = sys.argv[1] log.info("broswer_type=%s" % broswer_type) self.lp = LoginPage() self.lp.open_login_page(broswer_type)
self.lp.login("nbyh_admin","123456") result = self.lp.get_login_success_element() log.info("result = %s"%result) self.assertTrue(result) if __name__ == '__main__': # unittest.main() ts = unittest.TestSuite() #添加用例 ts.addTest(LoginTest("test_3")) # 添加所有用例 case_dir_name = os.path.abspath(os.path.dirname(os.getcwd())) + "/TestCase" discover = unittest.defaultTestLoader.discover(case_dir_name,"LoginTest.py") #获取当前日期 # day = datetime.now().strftime("%Y%m%d_%H%M%S") day = datetime.now().strftime("%Y%m%d") #获取用例名称,去掉.py case_name = os.path.basename(__file__).split(".")[0] dir_name = os.path.abspath(os.path.dirname(os.getcwd())) +"/Report" file_name = "report_" + case_name +"_"+ day+".html" report_name = os.path.join(dir_name,file_name) log.info("report_name = %s"%report_name) #打开report.html文件 fp = open(report_name,"wb") runner = HTMLTestRunner(fp) # runner.run(ts) runner.run(discover) fp.close()
def get_all_testcase(self): dir_name = os.path.abspath(os.path.dirname(os.getcwd())) test_case_dir = os.path.join(dir_name, "TestCase") log.info("test_case_dir=%s" % test_case_dir) ts = unittest.defaultTestLoader.discover(test_case_dir, "*Test.py") return ts
def get_pj_dir(self): pj_dir = os.path.abspath(os.path.dirname(os.getcwd())) log.info("pj_dir = %s" % pj_dir) return pj_dir
def get_row_count(self): nrows = self.sheet.nrows log.info("nrows=%s" % nrows) return nrows
#获取所有行数据 def get_all_row_data(self): nrows = self.get_row_count() log.info("nrows=%s" % nrows) data = [] for row in range(1, nrows): row_data = self.get_row_value(row) data.append(row_data) log.info("data=%s" % data) return data #指定单元格写入数据 def write_data(self, row, col, value): old_excel = self.rd new_excel = copy(old_excel) sheet = new_excel.get_sheet(0) sheet.write(row, col, value) new_excel.save(self.excel_file_name) if __name__ == '__main__': ed = GetExcelData() ed.open_excel_file() ed.get_row_count() data = ed.get_cell_value(1, 1) log.info("data=%s" % (data)) log.info("get_row_value=%s" % (ed.get_row_value(1))) log.info("get_col_value=%s" % (ed.get_col_value(1))) ed.write_data(1, 3, "write test") ed.get_all_row_data()
def test_search_all_company(self): self.sp.click_search_button() page_company_count = self.sp.get_page_company_count() db_company_count = self.sp.get_db_company_count() log.info("page_company_count=%s,db_company_count=%s"%(page_company_count,db_company_count)) self.assertEqual(page_company_count,db_company_count)