面向对象
优点:
创建可以跨多个测试用例共享的代码 减少重复代码的数量。如果用户界面发生了维护,我们只需要维护一个地方,这样修改以及维护的成本相对而言是比较低的
它的优势具体可以总结为如下:
- 创建可以跨多个测试用例共享的代码
- 减少重复代码的数量
- 如果用户界面发生了维护,我们只需要维护一个地方,这样修改以及维护的成本相对而言是比较低的
一、新建工程和目录
创建目录:
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(), '登录名或密码错误')