PO模式实践「建议收藏」

PO模式实践「建议收藏」目标1.能够采用PO模式的分层思想对页面进行封装1.V4版本采用PO模式的分层思想对代码进行拆分1.1PO分层封装对登录页面进行分层封装:对象库层:LoginPage操作层:LoginHandle业务层:LoginProxy调用业务层的方法,编写测试用例:测试用例:TestLogin1.2示例代码frompo.utilsimpo…

大家好,又见面了,我是你们的朋友全栈君。

目标

1.  能够采用PO模式的分层思想对页面进行封装

1. V4版本

采用PO模式的分层思想对代码进行拆分

1.1 PO分层封装

对登录页面进行分层封装:

对象库层:LoginPage 操作层:LoginHandle 业务层:LoginProxy

调用业务层的方法,编写测试用例:

测试用例:TestLogin

 

1.2 示例代码

from  po.utils  import  DriverUtil
 
 
class  LoginPage: """
对象库层
"""
 
def      init    (self):
self.driver  =  DriverUtil.get_driver()
 
# 用户名输入框
self.username  =  None
# 密 码
self.password  =  None     # 验证码输入框self.verify_code  =  None
# 登录按钮
self.login_btn  =  None
# 忘记密码
self.forget_pwd  =  None
 
def  find_username(self):
return  self.driver.find_element_by_id("username")
 
def  find_password(self):
return  self.driver.find_element_by_id("password")
 
def  find_verify_code(self):
return  self.driver.find_element_by_id("verify_code")
 
def  find_login_btn(self):
return  self.driver.find_element_by_name("sbtbutton")
 
def  find_forget_pwd(self):
return  self.driver.find_element_by_partial_link_text("忘记密码")
 
 
class  LoginHandle: """
操作层
"""
 
def      init    (self): self.login_page  =  LoginPage()
 
def  input_username(self,  username): self.login_page.find_username().send_keys(username)
 
def  input_password(self,  pwd): self.login_page.find_password().send_keys(pwd)
 
def  input_verify_code(self,  code): self.login_page.find_verify_code().send_keys(code)
 
def  click_login_btn(self): self.login_page.find_login_btn().click()
 
def  click_forget_pwd(self): self.login_page.find_forget_pwd().click()
 
 
class  LoginProxy: """
业务层
"""
def      init    (self):  self.login_handle  =  LoginHandle()
 
# 登 录
def  login(self,  username,  password,  verify_code):
# 输入用户名self.login_handle.input_username(username) # 输入密码self.login_handle.input_password(password)
# 输入验证码
self.login_handle.input_verify_code(verify_code)
# 点击登录按钮
self.login_handle.click_login_btn()
 
# 跳转到忘记密码页面
def  to_forget_pwd_page(self):
# 点击忘记密码
self.login_handle.click_forget_pwd()
 
import  unittest
 
from  po  import  utils
from  po.utils  import  DriverUtil
from  po.v4.page.login_page  import  LoginProxy
 
 
 
class  TestLogin(unittest.TestCase): """
对登录模块的功能进行测试
"""
 
@classmethod
def  setUpClass(cls):
cls.driver  =  DriverUtil.get_driver() cls.login_proxy  =  LoginProxy()
 
@classmethod
def  tearDownClass(cls): DriverUtil.quit_driver()
 
def  setUp(self):
# 打开首页
self.driver.get("http://localhost")
 
# 点击首页的‘登录’链接,进入登录页面
self.driver.find_element_by_link_text("登录").click()
 
# 账号不存在
def  test_login_username_is_error(self): self.login_proxy.login("13099999999",  "123456",  "8888")
 
# 断言提示信息
msg  =  utils.get_tips_msg() print("msg=",  msg)
self.assertIn("账号不存在",  msg)
 
# 密码错误
def  test_login_password_is_error(self): self.login_proxy.login("13012345678",  "123456",  "8888")
 
# 断言提示信息
msg  =  utils.get_tips_msg() print("msg=",  msg)
self.assertIn("密码错误",  msg)

2. V5版本

对PO分层之后的代码继续优化

1. 优化对象库层的代码,抽取元素的定位方式,把定位信息定义在对象的属性中,便于集中管理

2. 优化操作层的代码,针对输入操作应该先清空输入框中的内容再输入新的内容

from  selenium.webdriver.common.by  import  By from  po.utils  import  DriverUtil
 
class  LoginPage: """
对象库层
"""
 
def      init    (self):
self.driver  =  DriverUtil.get_driver()
 
# 用户名
self.username  =  (By.ID,  "username")
# 密 码
self.password  =  (By.ID,  "password")
# 验证码输入框
self.verify_code  =  (By.ID,  "verify_code")
# 登录按钮
self.login_btn  =  (By.NAME,  "sbtbutton")
# 忘记密码
self.forget_pwd  =  (By.PARTIAL_LINK_TEXT,  "忘记密码")
 
def  find_username(self):
return  self.driver.find_element(self.username[0],  self.username[1])
 
def  find_password(self):
return  self.driver.find_element(self.password[0],  self.password[1])
 
def  find_verify_code(self):
return  self.driver.find_element(self.verify_code[0],  self.verify_code[1])
 
def  find_login_btn(self):
return  self.driver.find_element(self.login_btn[0],  self.login_btn[1])
 
def  find_forget_pwd(self):
return  self.driver.find_element(self.forget_pwd[0],  self.forget_pwd[1])
 
 
 
class  LoginHandle: """
操作层
"""
 
def      init    (self): self.login_page  =  LoginPage()
 
def  input_username(self,  username): self.login_page.find_username().clear() self.login_page.find_username().send_keys(username)
 
def  input_password(self,  pwd): self.login_page.find_password().clear() self.login_page.find_password().send_keys(pwd)
 
def  input_verify_code(self,  code): self.login_page.find_verify_code().clear() self.login_page.find_verify_code().send_keys(code)
 
def  click_login_btn(self): self.login_page.find_login_btn().click()
 
def  click_forget_pwd(self): self.login_page.find_forget_pwd().click()
 
 
class  LoginProxy: """
业务层
"""
 
def      init    (self):  self.login_handle  =  LoginHandle()
 
# 登 录
def  login(self,  username,  password,  verify_code):
# 输入用户名
self.login_handle.input_username(username)
# 输入密码
self.login_handle.input_password(password)
# 输入验证码
self.login_handle.input_verify_code(verify_code)
# 点击登录按钮
self.login_handle.click_login_btn()
 
# 跳转到忘记密码页面
def  to_forget_pwd_page(self):                    # 点击忘记密码self.login_handle.click_forget_pwd()

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/131698.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python的flask框架_flask框架实例

    python的flask框架_flask框架实例Flask是一个Python编写的Web微框架,让我们可以使用Python语言快速实现一个网站或Web服务。本文参考自Flask官方文档,英文不好的同学也可以参考中文文档1.安装flaskpipinstallflask2.简单上手一个最小的Flask应用如下:fromflaskimportFlaskapp=Flask(__name__)@app.route(‘/’)defhello_world():return’HelloWorld’if__na

    2022年10月9日
    3
  • minicom 使用方法[通俗易懂]

    minicom 使用方法[通俗易懂]因为现在电脑基本不配备串行接口,所以,usb转串口成为硬件调试时的必然选择。目前知道的,PL2303的驱动是有的,在dev下的名称是ttyUSB#。minicom,tkterm都是linux下应用比较广泛的串口软件,这里简单介绍minicom使用。一,安装sudoapt-getinstallminicom二,配置安装完成后,请不要着急打开软件。需先进行配置。具体步

    2022年4月29日
    800
  • Java Spring框架 (底层原理+入门)

    Java Spring框架 (底层原理+入门)JavaSpring框架Spring一、Spring的概述定义:Spring框架是一个开放源代码的J2EE应用程序框架,由RodJohnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweightcontainer)。Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及WebMVC等功能。Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与Swing

    2022年7月7日
    40
  • Java中用fastjson对String、JSONObject、JSONArray相互转换

    Java中用fastjson对String、JSONObject、JSONArray相互转换fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将JavaBean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean下面主要是本人在工作中经常用到的关于String、JSONObject、JSONArray的相互装换String——>>>JSONArrayStringst="[{name:Tim,age…

    2022年6月20日
    23
  • Hdu1396「建议收藏」

    Hdu1396「建议收藏」//CountingTriangles/*顶角朝上的三角形:a[i]=a[i-1]+c(i+1,2)(从底边任选两点为正三角形底边)顶角朝下的三角形:b[i]=b[i-1]+c((i+1)/2,2)+c((i+2)/2,2)(因为偶数边长的正三角形和其边长一半的反三角形存在着对应关系,所以将底边所有的点分为两类:奇数和偶数点;再在相应的奇数…

    2022年8月12日
    9
  • pycharm2020.2.3专业版安装教程_pycharm部署项目到服务器

    pycharm2020.2.3专业版安装教程_pycharm部署项目到服务器利用pycharm2021学生教育版远程连接linux服务器上的代码并进行调试。

    2022年8月29日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号