zoukankan      html  css  js  c++  java
  • UI自动化之page object设计模式

    在编写UI自动化脚本过程,需要考虑如何编写才能使脚本更容易维护及复用率更高,可读性更高。page object(以下称:PO模式)设计模式是Selenium 自动化测试项目开发实践的最佳设计模式之一,其核心思想就是将测试对象及测试脚本分层处理,对界面交互细节的封装,这样可以使测试案例更关注与业务而非界面细节,提高测试案例的可读性。

    PO模式中会先定义一个公共基类,里面封装底层操作接口,供其他上层使用。在PO模式中一个用例脚本可分为:元素和操作层(放置在一个模块中)、用例层(各操作组装放在一个模块中)、数据层(对应测试数据),下面以登录163邮箱为例进行说明。

    目录结构如下:

    page基类

    from selenium import webdriver
    from selenium.common.exceptions import TimeoutException
    from selenium.webdriver.support.wait import  WebDriverWait
    from selenium.webdriver.common.by import By
    
    class Page():
        def __init__(self,driver):
            self.driver = driver
    
        def open(self,url):
            self.driver.get(url)
            self.driver.maximize_window()
    
    
        def find_element(self,*loc):
            try:
                wait = WebDriverWait(self.driver,timeout = 10)
                wait.until(lambda x:x.find_element(*loc).is_displayed())
                return self.driver.find_element(*loc)
            except TimeoutException:
                raise "Time out"
    
    
        def find_elements(self,*loc):
            try:
                wait = WebDriverWait(self.driver,timeout = 10)
                wait.until(lambda x:x.find_elements(*loc).is_displayed())
                return self.driver.find_elements(*loc)
            except TimeoutException:
                raise "Time out"
    
        def switch_iframe(self,*loc):
            name = self.driver.find_element(*loc)
            self.driver.switch_to_frame(name)
    
        def exit(self):
            self.driver.quit()

    loginpage中放置元素和操作层

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    
    import time as t
    from basic.page import Page
    
    class LoginPage(Page):
    
        _iframe_loc = (By.XPATH,"//div[@id='normalLoginTab']/div[0]/div[0]/iframe")
        _user_loc = (By.XPATH,'//input[@name="email" and @data-loginname="loginEmail"]')
        _paw_loc = (By.XPATH,'//input[@name="password" and @placeholder="输入密码"]')
        _logbt_loc = (By.ID,"dologin")
    
        def user_input(self,username):
            self.switch_iframe(*self._iframe_loc)
            self.find_element(*self._user_loc).send_key(username)
            return username
    
        def paw_input(self,password):
            self.find_element(*self._paw_loc).send_key(password)
    
        def login_button(self):
            self.find_element(*self._logbt_loc).click()

    test_login放置用例层

    from elementpage.loginpage import LoginPage
    from selenium import webdriver
    from basic.page import Page
    import time
    
    class TestLogin():
    
        def login(self,driver,url,username,password):
            """
            :param driver: driver
            :param url: url
            :param username: 用户名
            :param password: 密码
            :return:
            """
            obj = Page(driver)
            obj.open(url) #输入URL
            lobj = LoginPage(driver)
            lobj.user_input(username) #录入用户名
            lobj.paw_input(password)  #录入密码
            lobj.login_button()  #点击登录
            obj.exit()
  • 相关阅读:
    jQuery源码dom ready分析
    jQuery的deferred对象详解(二)
    jQuery的deferred对象详解(一)
    javascript线程解释(setTimeout,setInterval你不知道的事)---转载
    前端工程精粹(二):静态资源管理与模板框架
    拒绝了对对象 'sp_sdidebug'(数据库 'master',所有者 'dbo')的 EXECUTE 权限。
    Page.User.Identity.Name获取不到结果
    水晶报表(web)表格信息展示
    Office导入导出组件权限配置汇总
    CSS hack样式兼容模式收藏
  • 原文地址:https://www.cnblogs.com/heertong/p/12416736.html
Copyright © 2011-2022 走看看