PO模式-unittest

PO模式是指将页面元素的定位以及元素的操作分离出来,测试用例脚本直接调用这些封装好的元素操作来组织测试用例,从而实现了测试用例脚本和元素定位、操作的分离。

本文采用PO模式和unittest框架,对readmine系统执行了两条测试用例。

文件目录:

 PageObjects文件夹中,readmine_locators文件,存放元素定位。每个页面定义为一个类。

from selenium.webdriver.common.by import By


class LoginPageLocators():
    """用户登录页面"""
    LoginLink = (By.XPATH, '//*[@id="account"]/ul/li[1]/a')  # 打开首页的登录按钮
    Username = (By.ID, 'username')  # 登录名输入框
    Password = (By.ID, 'password')  # 密码输入框
    LoginButton = (By.NAME, 'login')
    LoginName=(By.ID,'loggedas')
    errormessage = (By.XPATH, '//*[@id="flash_error"]')


class ProjectListsPageLocators():
    """项目列表页面"""
    NewProjectButton = (By.XPATH, '//*[@id="content"]/div[1]/a[1]')


class NewProjectPageLocators():
    """新建项目页面"""
    ProjectName = (By.ID, 'project_name')  # 项目名文本框
    CommitButton = (By.NAME, 'commit')  # 创建项目按钮
    flashnotice = (By.ID, 'flash_notice')  # 创建成功/失败提示文本

readmine_operations存放对页面元素的操作,每个页面一个类,每个操作是一个函数

from ..PageObjects.readmine_locators import *
#这个包导入搞了好久
class BasePage():
    def __init__(self,driver):
        self.driver=driver

class LoginPage(BasePage):
    """用户登录页面的元素操作"""
    def enter_username(self,username):
        #输入用户名
        ele=self.driver.find_element(*LoginPageLocators.Username)
        ele.clear()
        ele.send_keys(username)
    def enter_password(self,password):
        ele=self.driver.find_element(*LoginPageLocators.Password)
        ele.send_keys(password)
    def click_login_button(self):
        ele=self.driver.find_element(*LoginPageLocators.LoginButton)
        ele.click()

    def find_login_name(self):
        #查找并返回登录成功后用户名
        ele = self.driver.find_element(*LoginPageLocators.LoginName)
        return ele
    def find_login_failed_info(self):
        #查找并返回登录失败后的提示信息元素
        ele=self.driver.find_element(*LoginPageLocators.errormessage)
        return ele

class NewProjectPage(BasePage):
    """新建项目页面操作"""
    def enter_project_name(self,projectname):
        #输入项目名
        ele=self.driver.find_element(*NewProjectPageLocators.ProjectName) #*用来调用类的属性?
        ele.clear()
        ele.send_keys(projectname)

    def click_commit_button(self):
        #点击创建成功按钮
        ele=self.driver.find_element(*NewProjectPageLocators.CommitButton)
        ele.click()

    def get_commit_message(self):
        #获取创建后提示
        ele=self.driver.find_element(*NewProjectPageLocators.flashnotice)
        return ele

class ProjectListPage(BasePage):
    def click_newproject_button(self):
        ele=self.driver.find_element(*ProjectListsPageLocators.NewProjectButton)
        ele.click()


Scenario文件夹下文件存放对场景。

readmine_login文件存放对于登录场景的类


from venv.Chapter12.Storm_12_1.PageObjects.readmine_operations import *

class LoginScenario():
    """封装登录页面场景操作"""
    def readmine_login(self,username,password):

        LoginPage(self).enter_username(username)#输入用户名和密码
        LoginPage(self).enter_password(password)
        LoginPage(self).click_login_button()
        return self






 readmine_new_project文件存放新建项目的场景


from venv.Chapter12.Storm_12_1.Scenario.readmine_login import *

import time
class NewProjectScenario():
    def readmine_new_project(self):
        #填写项目名并提交
        project_name='project_{}'.format(time.time())

        #访问项目列表页面
        ProjectListPage(self).click_newproject_button()
        NewProjectPage(self).enter_project_name(project_name)
        NewProjectPage(self).click_commit_button()
        return self


TestCase文件夹下,存放测试用例,一个场景一个文件。

test_001_login测试登录

import unittest
from selenium import  webdriver
from venv.Chapter12.Storm_12_1.Scenario.readmine_login import *
class TestStorm(unittest.TestCase):
    def setUp(self):
        self.driver=webdriver.Chrome()
        self.driver.get("http://demo.redmine.org/login")
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)
    def test_successlogin(self):
        """ 正确的用户名正确的密码"""
        LoginScenario.readmine_login(self.driver,'1111111111','1111111111')

    def tearDown(self):
        self.driver.quit()



if __name__=='__main__':
    unittest.main()

test_001_newproject测试新建项目

import unittest
from selenium import  webdriver
from venv.Chapter12.Storm_12_1.Scenario.readmine_new_project import *
class TestStorm(unittest.TestCase):
    def setUp(self):
        self.driver=webdriver.Chrome()
        self.driver.get("http://demo.redmine.org/login")
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)
        LoginScenario.readmine_login(self.driver, '11111111111', '111111111111111')
        self.driver.get("http://demo.redmine.org/projects")
    def test_new_project(self):

        NewProjectScenario.readmine_new_project(self.driver)
        ele=NewProjectPage(self.driver).get_commit_message()

        self.assertEqual(ele.text,'创建成功')


    def tearDown(self):
        self.driver.quit()



if __name__=='__main__':
    unittest.main()

注意事项:

1、注意包的导入。

2、注意什么时候用self,什么时候用self.driver。

3、注意页面之间的调用。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值