Page Object设计模式实战(2)
我们以企业微信为例,进行实战
1.首页pageObject
1)立即注册
点击立即注册
return立即注册pageObject
2)企业登陆
点击企业登陆
return企业登陆pageObject
2.登陆pageObject
1)扫码
用手机扫描二维码
2)立即注册
点击立即注册
return 立即注册pageObject
3.立即注册pageObject
1)填表
输入文本
下拉框
点击确定
流程走向图如下:
po就是为了链式的调用企业微信,先添加一个main模块,写一个Main()页面类,然后里面有go _to_register( )返回一个register实例,实例去调用register中的注册方法和go_to_login(),返回一个login实例 ,实例可以调用扫码登陆和注册方法
目录结构如下:
BasePage包
main模块 (首页,可以跳转到注册页面和登录页面)
base_page模块 (初始化浏览器驱动,定义一个页面基类,让所有页面都继承这个类,封装常用的页面操作方法到这个类)
register模块 (用户注册页面)
lgoin模块 (登陆页面,包含扫码登录和注册页面)
Test_Case包
test_register模块(测试注册页面的测试用例集)
main.py
from Base_page.base_page import Base_page
from Base_page.login import Login
from Base_page.register import Register
class Main(Base_page):
# _base_url重写了父类的变量,如果这里子类不重写父类方法将不会去访问父类的这个变量
_base_url = ""
def go_to_register(self):
# 不要忘记传递driver❗️❗️❗️
return Register(self.driver)
def go_to_login(self):
# 不要忘记传递driver
return Login(self.driver)
base_page.py
from selenium import webdriver
from selenium.webdriver.remote.webdriver import WebDriver
class Base_page():
_base_url = ""
"""
river:webdriver是python新的用法,就是加上:后面的标记,
当我们去访问driver的时候就可以.出方法和属性,
如果不加就无法点出,返回值后面加一个->也是同理
"""
def __init__(self, driver: WebDriver = None):
"""
为什么初始化的时候要传一个driver参数呢?
因为如果不传drivr参数的话,每次执行用例都要初始化一次self._driver=…吧啦吧啦,
如果我们有上万条case的时候,将会非常消耗性能;因此传一个driver进来进行复用,因此会判断,
driver是否为空,如果为空的话初始化,不为空的话,就使用传进来的driver;因此调用页面的时候会
经常带着driver这个参数
:param driver:
"""
self.driver = ''
if driver is None:
self.driver = webdriver.Chrome()
else:
self.driver = driver
if self._base_url != "":
self.driver.get(self._base_url)
# find()为封装后的方法
def find(self, by, locator):
return self.driver.find_element(by, locator)
register.py
from selenium.webdriver.common.by import By
from Base_page.base_page import Base_page
class Register(Base_page):
def register(self):
self.find(By.ID, "corp_name").send_keys()
# 获取某个元素的属性值,通过返回页面元素属性的值,去断言元素属性的值
self.name = self.find(By.ID, "corp_name").get_attribute("xxx")
return self.name
lgoin.py
from Base_page.base_page import Base_page
from Base_page.register import Register
class Login(Base_page):
def scan(self):
return True
def goto_register(self):
return Register(self.driver)
test_register.py
from Base_page.main import Main
class Testregister():
def setup(self):
"""
注意⚠️这里的Main()类中没有传入self.driver是因为我们这里是第一次调用
第一次的时候是会初始化一个webdriver的,因此不需要传入参数
:return:
"""
self.main = Main()
def test_register(self):
# 判断注册页面
assert self.main.go_to_register().register()
# 判断从登录页面进入的注册页面
assert self.main.go_to_login().goto_register().register()
# 判断属性值是否与预期相等
assert "xxx" == self.main.go_to_login().goto_register().register().name
浙公网安备 33010602011771号