1. page object:
对界面交互细节的封装
- 减少代码的重复
- 提高测试用例的可读性
- 提高测试用例的可维护性
2.实例:
#coding=utf-8 #防止乱码
'''------------------------页面test--------------------'''
#导入selenium的webdriver包,使用webdriver API进行自动化脚本开发
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
class page(object):
'''
基础类,用于所有页面的继承
'''
login_url = 'http://IP/#/login'
#定义驱动(driver)、基本的URL(base_url)和超时时间(timeout)
def __init__(self,selenium_driver,base_url=login_url):
self.base_url=base_url
self.driver=selenium_driver
self.timeout=30
#断言
def on_page(self):
return self.driver.current_url == (self.base_url + self.url)
#打开url地址
def _open(self,url):
#url = self.base_url + url
url = self.base_url
self.driver.get(url)
#设置断言提示信息
#assert self.on_page(),'Did not land on %s' %url
#打开地址
def open(self):
self._open(self.url)
#元素定位
def find_element(self,*loc):
return self.driver.find_element(*loc)
#元素封装
class LoginPage(page):
'''
登录页面模型
'''
url='/'
#定位器
username_loc=(By.XPATH,"//input[@class='el-input__inner']")
password_loc=(By.XPATH,"//*[@placeholder='password' and @class='el-input__inner']")
showpw_loc=(By.XPATH,"//span[@class='show-pwd']")
button_loc=(By.XPATH,"//button[@class='el-button el-button--primary']")
def type_username(self,username):
self.find_element(*self.username_loc).send_keys(username)
def type_password(self,password):
self.find_element(*self.password_loc).send_keys(password)
def showpw(self):
self.find_element(*self.showpw_loc).click()
def button(self):
self.find_element(*self.button_loc).click()
#执行动作
def test_user_login(driver,username,password):
'''测试获取的用户名/密码是否可以登录'''
login_page = LoginPage(driver)
login_page.open()
login_page.type_username(username)
login_page.type_password(password)
login_page.showpw()
login_page.button()
def test_user_login1(driver,username,password):
'''测试获取的用户名/密码是否可以登录'''
login_page = LoginPage(driver)
login_page.open()
login_page.type_username(username)
login_page.type_password(password)
login_page.showpw()
login_page.button()
def main():
try:
driver=webdriver.Chrome()
#设置账号密码输入
username='liaoguifen'
password='liao'
test_user_login(driver,username,password)
time.sleep(2)
error_message =driver.find_element(By.CSS_SELECTOR, ".el-form-item__error").text
assert(error_message =='密码不能小于6位'),"密码不能小于6位"
#截图 driver.get_screenshot_as_file('C:\\Users\\lgf\\Desktop\\webtest\\sell\\image\\pawd_error.png')
finally:
#driver.close()
driver.quit()
try:
driver=webdriver.Chrome()
#设置账号密码输入
username='liaoguifen'
password='liao'
time.sleep(2)
test_user_login1(driver,username,password)
#清除输入框内容
cl=driver.find_element(By.XPATH,"//input[@class='el-input__inner']").send_keys(chr(127)*int(10))
time.sleep(2)
error_message =driver.find_element(By.CSS_SELECTOR, ".el-form-item__error").text
assert(error_message =='密码不能小于6位'),"密码不能小于6位"
finally:
#driver.close()
driver.quit()
if __name__=='__main__':
main()
3.将元素与执行动作分类封装再引用对应模块
实例:
1)元素封装,po1.py
#coding=utf-8 #防止乱码
'''------------------------页面page object--------------------'''
#导入selenium的webdriver包,使用webdriver API进行自动化脚本开发
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
class page(object):
'''
基础类,用于所有页面的继承
'''
login_url = 'http://IP/#/login'
#定义驱动(driver)、基本的URL(base_url)和超时时间(timeout)
def __init__(self,selenium_driver,base_url=login_url):
self.base_url=base_url
self.driver=selenium_driver
self.timeout=30
#断言
def on_page(self):
return self.driver.current_url == (self.base_url + self.url)
#打开url地址
def _open(self,url):
#url = self.base_url + url
url = self.base_url
self.driver.get(url)
#设置断言提示信息
#assert self.on_page(),'Did not land on %s' %url
#打开地址
def open(self):
self._open(self.url)
#元素定位
def find_element(self,*loc):
return self.driver.find_element(*loc)
#元素封装
class pointPage(page):
'''
区域管理页面模型
'''
url='/'
#打开导航页签
NavigationBar_loc=(By.CSS_SELECTOR," .hamburger > path:nth-child(2)")
def NavigationBar(self):
self.find_element(*self.NavigationBar_loc).click()
#打开点位列表
point_loc=(By.CSS_SELECTOR, ".el-submenu:nth-child(2) > .el-submenu__title")
def point(self):
self.find_element(*self.point_loc).click
2)执行动作封装,po2.py
#coding=utf-8 #防止乱码
'''------------------------页面page object--------------------'''
#导入selenium的webdriver包,使用webdriver API进行自动化脚本开发
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#导入程序模块
import sys
sys.path.append("C:/Users/lgf/Desktop/webtest/sell/test_case")
from po1 import pointPage
class point_action():
def test_point(driver):
page = pointPage(driver)
page.NavigationBar()
print("打开导航列表完成")
time.sleep(2)
page.point()
time.sleep(1)
3)用例执行,po3.py
#设置程序所在目录
import sys
sys.path.append("C:/Users/lgf/Desktop/webtest/sell/test_case")
#导入程序模块
from LOGIN_OUT import LOGIN
sys.path.append("C:/Users/lgf/Desktop/webtest/sell")
from po2 import point_action
class POINT(unittest.TestCase):
'''点位管理页签测试'''
def setUp(self):
self.driver=webdriver.Chrome() #谷歌浏览器
driver=self.driver
driver.get("http://IP/#/login")#向浏览器发送网址(URL)
LOGIN().Login(driver)
print("开始时间",time.strftime("%Y/%m/%d %H:%M:%S"))#打印当前时间
#参数数字为像素点
#print("设置浏览器宽1500、高800显示")
driver.set_window_size(1500,800)
def test_A_POINT(self):
'''查询点位'''
driver=self.driver
time.sleep(2)#设置等待时间,必须设置,需要在页面暂停便于查找元素操作
po=pointPage(driver)
po.test_NavigationBar()
page.point()
def tearDown(self):
driver=self.driver
LOGIN().Logout(driver)#调用退出
print("完成时间",time.strftime("%Y/%m/%d %H:%M:%S"))#打印当前时间
if __name__ == "__main__":
unittest.main()
now = time.strftime("%Y-%m-%d %H-%M-%S")#打印当前时间
#定义报告存放路径
#fp=open('C:\\Users\\lgf\\Desktop\\webtest\\sell\\html_test\\QYGL_result.html','wb')
file='C:\\Users\\lgf\\Desktop\\webtest\\sell\\html_test\\'+ now+'testPO_result.html'
fp=open(file,'wb')
#定义测试报告,stream指定测试报告文件,title定义标题,description='用例执行情况:'
runner=HTMLTestRunner(stream=fp,title='售卖系统测试报告',description='用例执行情况:')
runner.run(testunit)#运行测试用例
fp.close()#关闭报告文件