我们以企业微信为例,进行实战
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