面向对象

优点:

创建可以跨多个测试用例共享的代码 减少重复代码的数量。如果用户界面发生了维护,我们只需要维护一个地方,这样修改以及维护的成本相对而言是比较低的

它的优势具体可以总结为如下:

  • 创建可以跨多个测试用例共享的代码
  • 减少重复代码的数量
  • 如果用户界面发生了维护,我们只需要维护一个地方,这样修改以及维护的成本相对而言是比较低的

一、新建工程和目录

创建目录:

base:基础层,主要编写的是底层元素封装

page:对象层,主要指的是把页面的每一个交互写成一个独立的方法

test:测试层,里面主要编写测试用例

common:公共方法,把公共的方法分离到这个里面

utils:工具类,主要指的是操作一些工具的类

data:把测试过程中的数据存储在这个目录下

report:测试报告,主要指的是存储生成的HTML的测试报告

 

 二、页面对象设计模式

(一)base基础层

from selenium import  webdriver
from selenium.webdriver.support.expected_conditions import NoSuchElementException
from selenium.webdriver.common.by import By
import  time as t


class WebDriver(object):
   def __init__(self,driver):
      # self.driver=webdriver.Chrome()
      self.driver=driver

   def findElement(self,*loc):
      '''单个元素的定位方式'''
      try:
         return self.driver.find_element(*loc)
      except NoSuchElementException as e:
         return e.args[0]

   def findElements(self,*loc):
      '''多个元素的定位方式'''
      try:
         return self.driver.find_elements(*loc)
      except NoSuchElementException as e:
         return e.args[0]

(二)page对象层

以sina的登录为例,新建login.py,代码如下:

from base.base import *
from selenium.webdriver.common.by import By


class Login(WebDriver):
    username=(By.ID,'freename')
    password=(By.ID,'freepassword')
    loginButton=(By.CLASS_NAME,'loginBtn')
    userError = (By.XPATH, '/html/body/div[1]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')

    def sendUsername(self,username):
        t.sleep(1)
        self.findElement(*self.username).send_keys(username)

    def sendPassword(self,password):
        t.sleep(1)
        self.findElement(*self.password).send_keys(password)

    def clickLogin(self):
        t.sleep(1)
        '''点击登录按钮'''
        self.findElement(*self.loginButton).click()

    def getUserError(self):
        t.sleep(1)
        '''获取用户名一栏的错误提示信息'''
        return self.findElement(*self.userError).text

(三)测试层test

test包下创建test_login.py的模块,代码如下:

import unittest
from page.login import  Login
from selenium import webdriver

class LoginTest(unittest.TestCase,Login):
    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_user_null(self):
        self.sendUsername('')
        self.clickLogin()
        self.assertEqual(self.getUserError(),'请输入邮箱名')

    def test_user_format(self):
        self.sendUsername('edg')
        self.clickLogin()
        self.assertEqual(self.getUserError(),'您输入的邮箱名格式不正确')

    def test_user_password(self):
        self.sendUsername('edg@sina.com')
        self.sendPassword('asd')
        self.clickLogin()
        self.assertEqual(self.getUserError(), '登录名或密码错误')