zoukankan      html  css  js  c++  java
  • Python (Page Object实例)

    Page Object是Selenium自动化测试项目开发实践的最佳设计模式之一,通过对界面元素和功能模块的封装减少冗余代码,同时在后期维护中,若元素定位或功能模块发生变化,只需要调整页面元素或功能模块封装的代码,提高测试用例的可维护性。

    案例:登录帝国网站(http://localhost)


     首先定义一个基础类,用于页面对象的继承

    BasePage.py

    from time import sleep
    
    class Page():
        '''页面基础类'''
    
        # 初始化
        def __init__(self, driver):
            self.driver = driver
            self.base_url = 'http://localhost'
            self.timeout = 10
    
        # 打开不同的子页面
        def _open(self, url):
            url_ = self.base_url + url
            print("The url is %s" % url_)
            # self.driver.maximize_window()
            self.driver.get(url_)
            sleep(2)
            assert self.driver.current_url == url_, 'Did not load on %s' % url_
    
        def open(self):
            self._open(self.url)
    
        # 元素定位方法封装
        def find_element(self, *loc):
            return self.driver.find_element(*loc)

    代码分析:

    首先创建一个基础类Page,在初始化方法__init__()中定义驱动(driver),基本的URL(base_url)和超时时间(timeout)等

    定义Open()方法用于打开URL网站,但它本身并未做这件事情,而是交由_open()方法来实现。关于URL地址的断言方法,则交由assert实现,而find_element()方法用于元素定位


     之后设计网站登录页面模型

    LoginPage.py

    from BasePage import *
    from selenium.webdriver.common.by import By
    
    class LoginPage(Page):
        url = "/"
    
        # 定位器
        username_loc = (By.NAME, 'username')
        password_loc = (By.NAME, 'password')
        submit_loc = (By.NAME, 'Submit')
    
        # 用户名输入框元素
        def type_username(self, username):
            self.find_element(*self.username_loc).clear
            self.find_element(*self.username_loc).send_keys(username)
    
        # 密码输入框元素
        def type_password(self, password):
            self.find_element(*self.password_loc).clear
            self.find_element(*self.password_loc).send_keys(password)
    
        # 登录按钮元素
        def type_submit(self):
            self.find_element(*self.submit_loc).click
    
    # 登录功能模块封装
    def test_user_login(driver, username, password):
        '''测试用户名密码是否可用'''
    
        login_page = LoginPage(driver)
        login_page.open()
        login_page.type_username(username)
        login_page.type_password(password)
        login_page.type_submit()

    代码分析:

    Page类中定义的这些方法都是页面操作的基本方法。上面根据再登录页面的特点再创建LoginPage类并继承Page类

    LoginPage类中主要对登录页面上的元素进行封装,使其成为更具体的操作方法,例如用户名,密码和登录按钮都被封装成了方法

    test_user_login()函数将单个的元素操作组成一个完整的动作,而这个动作包含了打开浏览器,输入用户名密码,点击登录等单步操作。在使用该函数时需要将driver、username、password等信息作为函数的入参,这样该函数具有很强的可重用性


     最后将用户名和密码传进去

    login_test.py

    from LoginPage import *
    from selenium import webdriver
    
    driver = webdriver.Firefox()
    username = '用户名'
    password = '密码'
    
    test_user_login(driver, username, password)
    
    sleep(3)
    driver.quit()

    login_test更接近用户的操作行为。对用户来说,要进行网站的登录,需要关心的就是通过哪个浏览器打开网站网址,登录的用户名和密码是什么。

    这样分层的好处是,不同的层关心不同的问题,页面对象层只关心元素的定位问题,测试用例只关心测试的数据

  • 相关阅读:
    docker6 管理工具
    docker1 初识docker
    libsvm处理多分类的问题
    selenium webdriver 的三种等待方式
    文本深度表示模型Word2Vec
    机器学习中训练集、验证集、测试集的定义和作用
    机器学习中防止过拟合的处理方法
    用Python读取大文件
    进化世界
    EDS(实例)
  • 原文地址:https://www.cnblogs.com/NancyRM/p/8566140.html
Copyright © 2011-2022 走看看