首页 技术 正文
技术 2022年11月10日
0 收藏 879 点赞 4,645 浏览 2334 个字

Page Object设计模式的优点如下:

①    减少代码的重复。

②    提高测试用例的可读性。

③    提高测试用例的可维护性,特别是针对UI频繁变化的项目。

当为Web页面编写测试时,需要操作该Web页面上的元素。然而,如果在测试代码中直接操作HTML元素,那么你的代码是极其脆弱的,因为UI经常变动。我们可以将一个page对象封装成一个HTML页面,然后通过提供的应用程序特定的API来操作页面元素, 而不是在HTML中四处搜寻。

Page对象的一个基本经验法则是:凡是人能做的事,Page对象通过软件客户端都能够做到。因此,它也应当提供一个易于编程的接口并隐藏窗口中底层的部件。所以访问一个文本框应该通过一个访问方法(accessor method)来实现字符串的获取与返回,复选框应当使用布尔值,按钮应当被表示为行为导向的方法名。Page对象应当将在GUI控件上所有查询和操作数据的行为封装为方法。一个好的经验法则是,即使改变具体的控件,page对象的接口也不应当发生变化。

尽管该术语是“页面”对象,但并不意味着需要对每个页面建立一个这样的对象. 例如,页面有重要意义的元素可以独立为一个page对象。经验法则的目的是通过给页面建模,使其对应用程序的使用者变得有意义。

实例代码如下:

# -*- coding:utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleepclass Page(object): # 实例化Page类时,最先执行的就是__init__方法,
# 该方法的入参,其实就是Page类的入参。
# self指实例本身,相较于类Page而言。
login_url = 'https://www.126.com' 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) # 以单下划线_开头的方法,
# 在使用import *时,该方法不会被导入,保证该方法为类私有的。
def _open(self, url):
url = self.base_url + url
self.driver.get(url)
assert self.on_page(), 'Did not land on %s' %url # 定义open方法,调用_open()进行打开链接
def open(self):
self._open(self.url) # loc入参为元组的元素,需要加*。
# Python存在这种特性,就是将入参放在元组里。
def find_element(self, *loc):
return self.driver.find_element(*loc)class LoginPage(Page): # 126邮箱登录页面模型
url = '/'
# 定位器
# 使用复合类名,直接使用会报错
username_loc = (By.CLASS_NAME, "dlemail")
password_loc = (By.CLASS_NAME, "dlpwd")
submit_loc = (By.ID, "dologin") # Action
def switch_frame(self, loc):
return self.driver.switch_to_frame(loc) def type_username(self, username):
self.find_element(*self.username_loc).clear()
self.find_element(*self.username_loc).send_keys(username) def type_password(self, password):
self.find_element(*self.password_loc).send_keys(password) def submit(self):
self.find_element(*self.submit_loc).click()def test_user_login(driver, loc, username, password): #测试获取的用户名/密码是否可以登录
login_page = LoginPage(driver)
login_page.open()
sleep(5)
login_page.switch_frame(loc)
login_page.type_username(username)
login_page.type_password(password)
login_page.submit()def mainTest(): try:
driver = webdriver.Chrome()
username = 'lili1505115417'
password = 'lili123456'
loc = 0
test_user_login(driver, loc, username, password)
sleep(5)
text = driver.find_element_by_id("spnUid").text
assert (text == 'lili1505115417@126.com'), "用户名称不匹配.登录失敗!"
finally:
#关闭浏览器窗口
driver.quit()
print('结束')if __name__ == '__main__':
mainTest()
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,493
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,495
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,133
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,297