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报告