自动化的页面对象设计
自动化的页面对象设计
目录结构
- 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')