selenium+pytest+allure+logging+pom
一、基础类封装:包括日志模块、获取当前项目根目录、读取excel文件;
1.日志(loggin)模块封装,请参考:
2.获取当前项目根目录(get_project_path)基础类,请参考:https://www.cnblogs.com/a-wyw/p/16186148.html
3.读取excel文件(Dtt+pytest)基础类,请参考:
二、POM设计模式实现
1.先封装基础页面类(BaseBage.py),代码如下:
1 from selenium.webdriver.common.by import By 2 from selenium.webdriver.support.wait import WebDriverWait 3 from selenium.webdriver.support import expected_conditions as EC 4 5 6 class BasePage(object): 7 def __init__(self, driver): 8 self.driver = driver 9 10 # 元素定位 11 def get_element(self, *loct): 12 self.driver.find_element(*loct) 13 14 # 文本框输入 15 def input_text(self, text, *loct): 16 self.driver.find_element(*loct).send_keys(text) 17 18 # 按钮/菜单点击 19 def ele_click(self, *loct): 20 self.driver.find_element(*loct).click() 21 22 # 文本框内容清空 23 def input_text_clear(self, *loct): 24 self.driver.find_element(*loct).clear() 25 26 # 获取页面标题名称 27 def get_driver_title(self): 28 return self.driver.title 29 30 # 获取提示框文本内容 31 def get_message_info(self, *loct): 32 return self.driver.find_element(*loct).text 33 34 # 等待Webdriver.title加载完成 35 def webdriver_title_wait(self, value): 36 WebDriverWait(self.driver, 5).until(EC.title_is(value)) 37 38 # 等待页面提示框加载 39 def messageinfo_wait(self, loct, excepted): 40 # 等待提示框加载,判断提示框文本与预期是否一致 41 WebDriverWait(self.driver, 5).until(EC.text_to_be_present_in_element(loct, excepted))
2.基于基础页面类(BaseBage.py)封装登录页面类(UserLoginPage.py),代码如下:
1 from testcase.pom.basicpage.BasePage import * 2 3 class UserLoginPage(BasePage): 4 user_input = [By.XPATH, '//*[@placeholder="请输入用户名"]'] 5 pwd_input = [By.XPATH, '//*[@placeholder="请输入密码"]'] 6 login_btn = [By.CSS_SELECTOR, '.btn_login'] 7 ele_message_info = [By.CSS_SELECTOR, ".el-message__content"] 8 9 def __init__(self, driver): 10 BasePage.__init__(self, driver) 11 12 def goto_login_page(self): 13 self.driver.get('http://192.168.10.232:9000/#/Login') 14 self.driver.maximize_window() 15 16 def input_username(self, username): 17 self.input_text_clear(*self.user_input) # 先清除文本框内容,再输入 18 self.input_text(username, *self.user_input) 19 20 def input_pwd(self, pwd): 21 self.input_text_clear(*self.pwd_input) # 先清除文本框内容,再输入 22 self.input_text(pwd, *self.pwd_input) 23 24 def bnt_click(self): 25 self.ele_click(*self.login_btn) 26 27 def message_info(self): 28 return self.get_message_info(*self.ele_message_info) 29 30 # 等待页面提示框加载 31 def message_wait(self, excepted): 32 # 等待提示框加载,判断提示框文本与预期是否一致 33 self.messageinfo_wait(self.ele_message_info, excepted) 34 35 # 打开页面等待webdriver.title加载完成 36 def webdriver_title(self, value): 37 self.webdriver_title_wait(value)
3.测试用例(TestUserLogin.py),代码如下:
1 import os 2 import allure 3 import pytest 4 from testcase.pom.basicpage.UserLoginPage import * 5 from testcase.basic import logging_basic 6 from selenium import webdriver 7 from testcase.ddt import test_excel 8 9 10 @allure.description("系统用户登录") 11 @allure.feature("系统用户登录") 12 class TestUserLogin(object): 13 # 加载本地excel文件,读取用户名和密码,其中第一个参数是文件名称,第二个参数是sheet页签名称 14 get_data = test_excel.get_excel_data('login.xls', 'login') 15 16 @allure.description("启动浏览器-初始化") 17 def setup_class(self): 18 self.driver = webdriver.Chrome() 19 self.UserLoginPage = UserLoginPage(self.driver) 20 self.logger = logging_basic.get_logger() 21 self.logger.info("***TestUserLogin-测试用户登录***") 22 23 @allure.description('关闭浏览器') 24 def teardown_class(self): 25 self.driver.quit() 26 self.logger.info("***WebDriver Closed***") 27 28 @allure.story("用户登录") 29 @pytest.mark.parametrize('username,pwd,excepted', get_data) # 参数化 30 def test_user_login(self, username, pwd, excepted): 31 # 打开登录页面 32 with allure.step("打开登录页面"): 33 self.UserLoginPage.goto_login_page() 34 self.logger.info("打开登录页面") 35 # 输入用户名 36 with allure.step("输入用户名"): 37 self.UserLoginPage.input_username(username) 38 self.logger.info('用户名:%s', username) 39 # 输入密码 40 with allure.step("输入密码"): 41 self.UserLoginPage.input_pwd(pwd) 42 self.logger.info('密码:%s', pwd) 43 # 点击登录 44 with allure.step("点击登录"): 45 self.UserLoginPage.bnt_click() 46 self.logger.info('点击登录') 47 # 等待跳转至管理平台页面 48 self.UserLoginPage.webdriver_title_wait("社会资源接入管理服务系统") # 判断页面标题 49 self.logger.info('跳转至管理平台页面') 50 # 等待页面提示框加载 51 self.UserLoginPage.message_wait(excepted) 52 # 获取弹出框的文本内容 53 message_content = self.UserLoginPage.message_info() 54 # 断言,判断预期内容与实际是否一致 55 try: 56 assert excepted == message_content 57 self.logger.info("断言成功:%s = %s", excepted, message_content) 58 59 except AssertionError: 60 # self.logger.error("异常捕获:%s", AssertionError, exc_info=1) 61 self.logger.exception("异常捕获:%s", AssertionError) 62 63 64 if __name__ == '__main__': 65 # case = TestUserLogin() 66 # case.test_user_login() 67 # pytest.main(['-vs', 'test_user_login.py']) 68 # 生成测试报告---json格式 69 pytest.main(['--alluredir', 'F:/PycharmProjects/selenium_project/report/allure_data', 'test_user_login_new.py',' -- ']) 70 # allure转换成---html并打开测试报告 71 os.system('cd F:/PycharmProjects/selenium_project/report/allure_data') 72 # 清理上次的报告并生成新的报告 73 os.system('allure generate F:/PycharmProjects/selenium_project/report/allure_data -o ' 74 'F:/PycharmProjects/selenium_project/report/html --clean') 75 os.system('allure serve F:/PycharmProjects/selenium_project/report/allure_data'
4.运行效果如下:
(1)日志记录
(2)生成allure报告