当前位置:   article > 正文

Python Web自动化测试学习-PO模型在自动化测试中的应用(2)_python基于po模型做webui自动化测试

python基于po模型做webui自动化测试

公共方法篇
用例生成

页面封装

test
pages
basePage.py
基础页面封装

# -*-coding:utf-8-*-
import os
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
class BasePage(object):
    """基础页面"""
    def __init__(self, driver=None, base_url=None):
        """
        基础的参数,webdriver、默认访问的url
        :param driver: 浏览器驱动
        :param base_url: 默认打开url,一般都是登录页面
        """
        if driver is None:
            current_path = os.path.abspath(os.path.dirname(__file__))
            driver_path = current_path + '/../../drivers/chromedriver.exe'
            self.driver = webdriver.Chrome(driver_path)
        else:
            self.driver = driver
        if base_url is None:
            self.base_url = 'http://localhost:21248/#/'
        else:
            self.base_url = base_url
        # 设置默认打开的页面
        self.open_page()
    def open_page(self):
        """打开默认页面"""
        self.driver.maximize_window()
        self.driver.implicitly_wait(10)
        self.driver.get(self.base_url)
        sleep(1)
    def close_page(self):
        """关闭页面"""
        return self.driver.close()
    def quit_driver(self):
        """关闭页面并且退出程序"""
        return self.driver.quit()
    def find_element(self, by, element):
        """返回单个定位元素"""
        sleep(1)
        return self.driver.find_element(by, element)
    def find_elements(self, by, element):
        """返回一组定位元素"""
        sleep(1)
        return self.driver.find_elements(by, element)
    def switch_alert(self):
        """返回弹窗页面"""
        sleep(1)
        return self.driver.switch_to.alert
    def select_menu(self, menu_text=None):
        """菜单选择"""
        sleep(1)
        menus_element = self.driver.find_elements(By.CSS_SELECTOR, "#menu>div>h4")
        for menu in menus_element:
            # replace(" ", "")去掉字符串中的空格
            if menu.text.replace(" ", "") == menu_text.replace(" ", ""):
                return menu.click()
        print(menu_text + "未找到")
        return
    def log_out(self):
        """退出登录"""
        return self.select_menu("退出登录")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62

test
pages
loginPage.py
登录页面封装

# -*-coding:utf-8-*-
import os
from selenium.webdriver.common.by import By
from test.pages.basePage import BasePage
from utils.readConfig import ReadConfig
class LoginPage(BasePage):
    """登录页面"""
    def email_element(self):
        """邮箱地址"""
        return self.find_element(By.CLASS_NAME, "email")
    def password_element(self):
        """密码"""
        return self.find_element(By.CLASS_NAME, "password")
    def login_button(self):
        """登录按钮"""
        return self.find_element(By.CSS_SELECTOR, ".login-btn>input[value='登  录']")
    def email_error_element(self):
        """邮箱地址错误"""
        return self.find_element(By.CSS_SELECTOR, ".email+div.msg")
    def password_error_element(self):
        """密码错误"""
        return self.find_element(By.CSS_SELECTOR, ".password+div.msg")
    def login_fail_element(self):
        """登录失败"""
        return self.switch_alert()
    def login(self, email=None, password=None):
        """登录操作"""
        account_email, account_password = self.get_account()
        if email is None:
            email = account_email
        else:
            email = email
        if password is None:
            password = account_password
        self.email_element().send_keys(email)
        self.password_element().send_keys(password)
        self.login_button().click()
    @staticmethod
    def get_account():
        """获取默认邮箱地址和密码"""
        current_path = os.path.abspath(os.path.dirname(__file__))
        json_path = current_path + '/../../config/base_data.json'
        account = ReadConfig().read_json(json_path)
        return account['email'], account['password']
if __name__ == '__main__':
    a = LoginPage()
    a.login()
    a.quit_driver()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

test
pages
homePage.py
主页页面封装

# -*-coding:utf-8-*-
from time import sleep
from selenium.webdriver.common.by import By
from test.pages.loginPage import LoginPage
from test.common.tableOperation import TableOperation
class HomePage(LoginPage):
    """主页页面"""
    # 检索
    def search_input_element(self):
        """检索输入框"""
        return self.find_element(By.ID, "search-input")
    def search_button_element(self):
        """检索按钮"""
        return self.find_element(By.CLASS_NAME, "search")
    # 按钮
    def add_button_element(self):
        """新增按钮"""
        return self.find_element(By.ID, "add")
    def edit_button_element(self):
        """编辑按钮"""
        return self.find_element(By.ID, "edt")
    def delete_button_element(self):
        """删除按钮"""
        return self.find_element(By.ID, "del")
    # 编辑弹窗
    def edit_code_element(self):
        """学号输入框"""
        return self.find_element(By.CSS_SELECTOR, "#add-dialog .code")
    def edit_name_element(self):
        """姓名输入框"""
        return self.find_element(By.CSS_SELECTOR, "#add-dialog .name")
    def edit_sex_element(self):
        """性别输入框"""
        return self.find_element(By.CSS_SELECTOR, "#add-dialog .sex")
    def edit_grader_element(self):
        """年级输入框"""
        return self.find_element(By.CSS_SELECTOR, "#add-dialog .grader")
    def edit_confirm_button_element(self):
        """编辑确定按钮"""
        return self.find_element(By.CSS_SELECTOR, "#add-dialog #confirm")
    def edit_cancel_button_element(self):
        """编辑取消按钮"""
        return self.find_element(By.CSS_SELECTOR, "#add-dialog #cancel")
    # 删除弹窗
    def del_confirm_button_element(self):
        """删除确定按钮"""
        return self.find_element(By.CSS_SELECTOR, "#del-dialog #confirm")
    def del_cancel_button_element(self):
        """删除取消按钮"""
        return self.find_element(By.CSS_SELECTOR, "#del-dialog #cancel")
    # 页面操作方法
    def search(self, text):
        """检索操作"""
        self.search_input_element().clear()
        self.search_input_element().send_keys(text)
        self.search_button_element().click()
    def edit_dialog(self, code=None, name=None, sex=None, grader=None, button=None):
        """编辑弹窗操作"""
        if code is not None:
            self.edit_code_element().clear()
            self.edit_code_element().send_keys(code)
        if name is not None:
            self.edit_name_element().clear()
            self.edit_name_element().send_keys(name)
        if sex is not None:
            self.edit_sex_element().clear()
            self.edit_sex_element().send_keys(sex)
        if grader is not None:
            self.edit_grader_element().clear()
            self.edit_grader_element().send_keys(grader)
        if button == "确定":
            self.edit_confirm_button_element().click()
        elif button == "取消":
            self.edit_cancel_button_element().click()
        else:
            print("编辑弹窗中按钮只能是确定和取消")
    def add_data(self, code, name, sex=None, grader=None, button="确定"):
        """
        由于code、name为必输项,所有一定要接收参数
        但sex、grader为非必输项,所有可以不用传值,默认参数设置为None
        :param code:学号,必输项
        :param name:姓名,必输项
        :param sex:性别,非必输
        :param grader:年级,非必输
        :param button:新增时按钮一般都是确认按钮,所有按钮的默认值传入确定
        :return:
        """
        self.add_button_element().click()
        self.edit_dialog(code, name, sex, grader, button)
    def edit_data(self, header_text, row_text, code=None, name=None, sex=None, grader=None, button="确定"):
        """编辑数据"""
        # 使用row_click()方法是为了直接选择要编辑的数据
        TableOperation(self.driver).row_click(header_text, row_text)
        self.edit_button_element().click()
        self.edit_dialog(code, name, sex, grader, button)
    def delete_data(self, header_text, row_text, button="确定"):
        """编辑数据"""
        # 使用row_click()方法是为了直接选择要删除的数据
        TableOperation(self.driver).row_click(header_text, row_text)
        self.delete_button_element().click()
        if button == "确定":
            self.del_confirm_button_element().click()
        elif button == "取消":
            self.del_cancel_button_element().click()
        else:
            print("编辑弹窗中按钮只能是确定和取消")
"""
测试代码
if __name__ == '__main__':
    from selenium import webdriver
    driver = webdriver.Chrome()
    a = LoginPage(driver)
    a.login()
    home = HomePage(driver)
    home.add_data('1001', "张三")
    home.search("张三")
    home.edit_data('姓 名', "张三", name="李四")
    home.search("李四")
    sleep(1)
    home.delete_data('姓 名', "李四")
    sleep(3)
    a.quit_driver()
"""
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123

test
pages
aboutPage.py
关于我们页面封装

# -*-coding:utf-8-*-
from selenium.webdriver.common.by import By
from test.pages.loginPage import LoginPage
class AboutPage(LoginPage):
    """关于我们页面"""
    def about_element(self):
        """关于我们页面判断元素"""
        return self.find_element(By.CSS_SELECTOR, "#about h1")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/540133?site
推荐阅读
相关标签
  

闽ICP备14008679号