自动化的页面对象设计

自动化的页面对象设计

目录结构

  • base的包下主要编写基础的代码,可以理解为基础层
  • page包下主要存放对象层的代码,可以理解为对象层
  • test报下主要存放编写的测试模块的代码,可以理解为测试层
  • utils下存放的主要是工具类的代码,比如针对JSON文件,YAML文件的处理
  • common下主要存放的是公共类的代码,比如文件目录的处理
  • data主要存放测试过程中使用到的数据
  • report主要存储的是测试报告这部分

 

base(基础层)

主要是基础层的代码,具体为:

 

from selenium import webdriver
from selenium.webdriver.common.by import By
import time as t

class webUI(object):
    def __init__(self,driver): #该driver指的是webdriver实例化的对象
        self.driver=driver #self.driver==webdriver.Chrome

    def findElement(self,*args):
        '''单个元素定位'''
        try:
            return self.driver.find_element(*args)
        except Exception as e:
            print(e.args)

    def findElements(self,*args):
        '''多个元素定位'''
        try:
            return self.driver.find_elements(*args)
        except Exception as e:
            print(e.args)

page(对象层)

以sina 邮箱为例编写代码,里面的具体代码为:

#! /usr/bin/env python
# -*- coding:utf-8 -*-
# author:晨黎
from base.base import webUI
from selenium.webdriver.common.by import By
import  time as t

class Register(webUI):
    '''编写页面操作的每一个行为'''
    enrollname = (By.XPATH, '/html/body/div[2]/div/div/div/div/form[1]/div[2]/ul/li[1]/span/input')
    reg=(By.LINK_TEXT,'立即注册')
    emailEooor = (By.XPATH, '/html/body/div[2]/div/div/div/div/form[1]/div[2]/ul/li[1]/div[3]/p')
    emailAge=(By.XPATH,'/html/body/div[2]/div/div/div/div/form[1]/div[2]/ul/li[1]/div[3]/p')

    enrollpassword=(By.NAME,'psw')
    Wordage=(By.XPATH,'/html/body/div[2]/div/div/div/div/form[1]/div[2]/ul/li[2]/div[1]/p')
    enrollcfpassword=(By.NAME,'npsw')
    encfpw=(By.XPATH,'/html/body/div[2]/div/div/div/div/form[1]/div[2]/ul/li[3]/div/p')






    def enrollName(self, vaule):
        '''输入注册邮箱'''
        self.findElement(*self.enrollname).send_keys(vaule)
        t.sleep(5)

    def clickenrollName(self,):
        '''点击邮箱地址输入框'''
        self.findElement(*self.enrollname).click()

    def enrollPassword(self,vaule):
        '''输入注册密码'''
        self.findElement(*self.enrollpassword).send_keys(vaule)
        t.sleep(5)

    def enrollCFPassword(self,vaule):
        '''点击确认密码输入框'''
        self.findElement(*self.enrollcfpassword).send_keys(vaule)
        t.sleep(5)

    def clickenrollPassword(self,):
        '''点击密码输入框'''
        self.findElement(*self.enrollpassword).click()

    def clickinstantenrool(self):
        '''点击立即注册按钮'''
        self.findElement(*self.reg).click()
        t.sleep(3)

    def getEmailText(self):
        '''获取注册邮箱错误信息'''
        return self.findElement(*self.emailEooor).text

    def getEmailAgeText(self):
        '''获取注册邮箱规则信息'''
        return self.findElement(*self.emailAge).text

    def getCFPWText(self):
        '''获取确认密码错误信息'''
        return self.findElement(*self.encfpw).text

    def getPassAgeText(self):
        '''获取注册密码规则信息'''
        return self.findElement(*self.Wordage).text

test(测试层)

在test包下创建相应test_sina_模块,具体代码为:

#! /usr/bin/env python
# -*- coding:utf-8 -*-
# author:晨黎

from  selenium import webdriver
import unittest
from page.login import Login
from page.enroll import Register
import  time as t
from utils.operationjson import readJson
from page.init import Init


class longTest(Init,Login,Register):
# class longTest(unittest.TestCase,Login,Register):
#     def setUp(self) -> None:
#         self.driver=webdriver.Chrome()
#         self.driver.maximize_window()
#         self.driver.get('https://mail.sina.com.cn/')
#         self.driver.implicitly_wait(30)
#
#     def tearDown(self) -> None:
#         self.driver.close()

    def test_sina_enroll_username(self):
        '''注册邮箱为空'''
        nowHandle=self.driver.current_window_handle
        self.clickloginReg()
        allHandlers=self.driver.window_handles
        for handle in allHandlers:
            if handle!=nowHandle:
                self.driver.switch_to.window(handle)
                self.clickinstantenrool()
                text=self.getEmailText()
                self.assertEqual(text,readJson()['login']['emailNull'])

    def test_sina_enroll_AGE(self):
        '''获取注册邮箱规则'''
        nowHandle=self.driver.current_window_handle
        self.clickloginReg()
        allHandlers=self.driver.window_handles
        for handle in allHandlers:
            if handle!=nowHandle:
                self.driver.switch_to.window(handle)
                self.clickenrollName()
                # print(self.getEmailAgeText())
                text=self.getEmailAgeText()
                self.assertEqual(text,readJson()['enroll']['qwesse'])

    def test_sina_enroll_Bge(self):
        '''获取注册密码规则'''
        nowHandle=self.driver.current_window_handle
        self.clickloginReg()
        allHandlers=self.driver.window_handles
        for handle in allHandlers:
            if handle!=nowHandle:
                self.driver.switch_to.window(handle)
                self.clickenrollPassword()
                text=self.getPassAgeText()
                self.assertEqual(text,readJson()['enroll']['asdfg'])

    def test_sina_enroll_hanchinesename(self):
        '''注册邮箱含有中文'''
        nowHandle=self.driver.current_window_handle
        self.clickloginReg()
        allHandlers=self.driver.window_handles
        for handle in allHandlers:
            if handle!=nowHandle:
                self.driver.switch_to.window(handle)
                self.enrollName(vaule='计算出随车吊素材是不好吃三')
                self.enrollPassword(vaule='12345554')
                text=self.getEmailText()
                self.assertEqual(text,readJson()['enroll']['chinaname'])

    def test_sina_enroll_Englishbigename(self):
        '''注册邮箱含有英文大写'''
        nowHandle=self.driver.current_window_handle
        self.clickloginReg()
        allHandlers=self.driver.window_handles
        for handle in allHandlers:
            if handle!=nowHandle:
                self.driver.switch_to.window(handle)
                self.enrollName(vaule='QWERTYUJHV')
                self.enrollPassword(vaule='12345554')
                text=self.getEmailText()
                self.assertEqual(text,readJson()['enroll']['Englishbig'])

    def test_sina_enroll_quannumbername(self):
        '''注册邮箱含有纯数字'''
        nowHandle=self.driver.current_window_handle
        self.clickloginReg()
        allHandlers=self.driver.window_handles
        for handle in allHandlers:
            if handle!=nowHandle:
                self.driver.switch_to.window(handle)
                self.enrollName(vaule='1234566543456')
                self.enrollPassword(vaule='12345554')
                text=self.getEmailText()
                self.assertEqual(text,readJson()['enroll']['number'])

    def test_sina_enroll_PASSDOWN(self):
        '''获取注册密码强度低'''
        nowHandle=self.driver.current_window_handle
        self.clickloginReg()
        allHandlers=self.driver.window_handles
        for handle in allHandlers:
            if handle!=nowHandle:
                self.driver.switch_to.window(handle)
                self.enrollName(vaule='ertfgfgfggg')
                self.enrollPassword(vaule='123456')
                self.enrollCFPassword(vaule='123456')
                self.clickinstantenrool()
                text=self.getPassAgeText()
                self.assertEqual(text,readJson()['enroll']['passworddown'])

    def test_sina_enroll_doubtname(self):
        '''注册两次密码不一致'''
        nowHandle=self.driver.current_window_handle
        self.clickloginReg()
        allHandlers=self.driver.window_handles
        for handle in allHandlers:
            if handle!=nowHandle:
                self.driver.switch_to.window(handle)
                self.enrollName(vaule='ertfgfgfggg')
                self.enrollPassword(vaule='cl123456')
                self.enrollCFPassword(vaule='cl098765')
                self.clickinstantenrool()
                text=self.getCFPWText()
                self.assertEqual(text,readJson()['enroll']['double'])

common(公共方法)

在common下创建public模块,里面主要是文件路径的处理,具体代码:

 

import os

def bas_dir():
    return os.path.dirname(os.path.dirname(__file__))#获取路径

def readfile(dirctory='data',fileName=None):
    return os.path.join(bas_dir(),dirctory,fileName)#拼接路径

utils

在utils包下创建operation模块,主要存放针对JSON,YAML等文件的处理,具体代码:

 

import os
import json
from common.public import readfile




def readJson():
    return json.load(open(readfile('data','sina.json'),encoding='utf-8'))
# print(readJson())

 

 

 

当遇到无法获取文本信息时就需要用到截图来进行断言,代码为:

driver.get_screenshot_as_file(filename='sina.png')

 

posted @ 2021-12-21 18:59  晨^O^黎  阅读(41)  评论(0编辑  收藏  举报