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()
原文地址:https://www.cnblogs.com/heertong/p/12416736.html