首页 > 技术文章 > Page Object设计模式实战(2)

zhaikunkun 2020-04-01 16:08 原文

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

推荐阅读