Python&Selenium自动化测试之PO设计模式

版权声明:本文为博主原创,感谢支持与鼓励 转载请注明出处 https://blog.csdn.net/dawei_yang000000/article/details/86317923

一、摘要

Page Object模式,后面简称PO,他是一种设计思想,在上一章节中,曾经列举了一些在编写自动化测试过程中随着代码量的增加导致的大量代码难以维护、难以扩展、可读性极差等灾难性的事件;那么PO模式是能够帮我们解决一部分问题的解决方案; 在此笔者更愿意将其称之为一种设计模式,一种设计思想;所谓Page Object及页面对象,页面对象是哪些东西呢?比如一个按钮是一个对象,一个页面也是一个对象,这种设计模式有什么好处呢?

如果我们以页面为单位,将页面中的控件一一提炼,甚至为某些页面中的控件封装相应的方法,我们便可以在测试代码中直接使用它,从而实现了页面对象和测试代码的分离;

提炼出来之后再多个脚本使用到同一个页面对象时,也不需要再重新写直接调用它即可大大提高了代码的复用性和可读性;

如果UI经常发生变化,无疑也提高了测试代码的可维护性,页面对象变动那么只需要修改一处便多处生效;

二、实例代码

# encoding = utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep


class Page():
    """
    基础类,仅用于定义一些页面常规内容及方法
    后续各个页面类继承该类实现各自页面的特别内容及方法
    """
    login_url = 'http://mail.163.com'  # 定义基类参数默认值,当调用时未提供该参数时使用

    def __init__(self, driver, base_url=login_url):
        self.base_url = base_url
        self.driver = driver
        self.timeout = 30

    def target_page(self):
        return self.driver.current_url == self.base_url  #  判断当前打开的url与参数给的url是否一致

    def open(self, url):
    	"""打开页面"""
        url = self.base_url
        self.driver.get(url)
        print(self.driver.current_url)
        
    def find_element(self, *loc):
        return self.driver.find_element(*loc)


class LoginPage(Page):
    """
    登陆页面,页面对象类
    """
    url = '/'
    """
    此处我们暂时称页面元素为对象,虽然本代码并非那么像对象,后续的框架中我们更高度的封装它便是个可操作的对象
    """
    username_loc = (By.NAME, "email")  # 页面控件对象:输入用户名的input控件
    password_loc = (By.NAME, "password")  # 页面控件对象:输入密码的input控件
    submit_loc = (By.ID, "dologin")  # 页面控件对象:登陆按钮的button控件

    """
    为每个页面元素对象封装其相对应的方法
    """
    def input_username(self, username):
        self.find_element(*self.username_loc).send_keys(username)  # 输入用户名

    def input_password(self, password):
        self.find_element(*self.password_loc).send_keys(password)  # 输入密码

    def click_submitbutton(self):
        self.find_element(*self.submit_loc).click()  # 点击登陆按钮


def user_login(driver, username, password):
    login_page = LoginPage(driver)
    login_page.open()
    sleep(5)
    driver.switch_to.frame(driver.find_element_by_xpath("//*[@id='loginDiv']/iframe"))
    login_page.input_username(username)
    sleep(3)
    login_page.input_password(password)
    sleep(3)
    login_page.click_submitbutton()


def main():
    try:
        driver = webdriver.Chrome()
        username = 'xxxxxx'  # 登陆邮箱需要的真实账号
        password = 'xxxxxx'  # 登陆邮箱需要的真实密码
        user_login(driver, username, password)  # 调用前面封装好的user_login方法
        sleep(3)  #  等待3秒
        driver.switch_to.default_content()  # 切换出iframe
        assert_string = driver.find_element_by_xpath("/html/body/div[1]/nav/div[1]/ul/li[1]/span[2]").text
        print(assert_string)
        assert (assert_string == '收 信')  # 断言关键字
    finally:
        driver.quit()  # 关闭浏览器窗口


if __name__ == '__main__':
    main()

猜你喜欢

转载自blog.csdn.net/dawei_yang000000/article/details/86317923