Python3-Selenium3使用PO设计模式(Page Object)实现简单的页面登录操作

博文章节

  • 博文章节
    • 本机环境介绍
    • PO设计模式概念及优点
    • 项目目录结构
    • PO基类
    • 登录页PO设计模式
    • 测试类
    • 拓展


本机环境介绍

编码语言(Python)

(py3env) C:\Users\XXX\iCloudDrive\PycharmProjects\SAT>python -V
Python 3.6.2

Selenium版本(3.7.0)

(py3env) C:\Users\XXX\iCloudDrive\PycharmProjects\SAT>pip show selenium
Name: selenium
Version: 3.7.0
Summary: Python bindings for Selenium

PO设计模式(概念及优点)

  • 概 念

    PO(Page Object)设计模式是一种面向对象(页面对象)的设计模式,将测试对象及单个的测试步骤封装在每个Page对象中,以page为单位进行管理。

  • 优点

    可以使代码复用,降低维护成本,提高程序可读性和编写效率。
    可以将页面定位和业务操作分开,分离测试对象(元素对象)和测试脚本(用例脚本),提高用例的可维护性。

项目目录结构

C:.
├─docs  # 文档目录
├─logs  # 日志目录
├─sat
│  ├─ui
│  │  ├─base
│  │  │  └─__init__.py
│  │  │  └─base_page.py  # PO基类
│  │  │  └─browser_engine.py  # 浏览器引擎类
│  │  │  └─browser_type.py  # 浏览器类型类(暂没使用)
│  │  ├─pom
│  │  │  └─__init__.py
│  │  │  └─login_page.py  # 登录页(PO设计模式)
│  │  ├─resource
│  │  │  └─chromedriver.exe  # Chrome浏览器驱动
│  │  │  └─geckodriver.exe  # Firefox浏览器驱动
│  │  │  └─IEDriverServer.exe  # IE浏览器驱动
│  ├─utils
│  │  └─__init__.py
│  │  └─common.py  # 公共工具类
│  └─__init__.py
│  └─settings.py  # 系统配置类
└─test
│  └─__init__.py
│  └─test.py  # 测试类
└─requirements.txt  # 包管理

PO基类

base_page.py

# -*- coding: utf-8 -*-

"""
  @desc: page object测试基类
  @author: Amio_
  @file: base_page.py
  @date: 2017/12/18 12:01
"""
from selenium.common.exceptions import NoSuchElementException, TimeoutException
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

from sat import settings


class BasePage(object):
    def __init__(self, driver, url):
        self._driver = driver
        self._url = url

    def open(self, page_title=None):
        """
        打开指定网页
        :param page_title: 网页title, 不必填
        :return: 若传入的page_title与网页title不同则触发断言
        """
        self._driver.maximize_window()
        self._driver.get(url=self._url)
        if page_title is not None:
            assert page_title in self._driver.title

    def find_element(self, *locator, timeout=None):
        try:
            return self._init_wait(timeout).until(EC.visibility_of_element_located(locator=locator))
        except (NoSuchElementException, TimeoutException):
            self._driver.quit()
            raise TimeoutException(msg='寻找元素失败, 定位方式为: {}'.format(locator))

    def send_keys(self, webElement, keys):
        webElement.clear()
        webElement.send_keys(keys)

    def _init_wait(self, timeout):
        if timeout is None:
            return WebDriverWait(driver=self._driver, timeout=settings.UI_WAIT_TIME)
        else:
            return WebDriverWait(driver=self._driver, timeout=timeout)

登录页(PO设计模式)

login_page.py

# -*- coding: utf-8 -*-

"""
  @desc: 登录页PO
  @author: Amio_
  @file: login_page.py
  @date: 2017/12/18 12:01
"""
from selenium.webdriver.common.by import By

from sat.ui.base.base_page import BasePage


class LoginPage(BasePage):
    URL = 'https://www.douban.com/'
    USERNAME = (By.ID, 'form_email')
    PASSWORD = (By.ID, 'form_password')
    SUBMIT_BTN = (By.XPATH, "//input[@class='bn-submit']")

    def __init__(self, driver):
        super().__init__(driver=driver, url=self.URL)

    def login(self):
        self.open('豆瓣')
        self.send_keys(webElement=self.find_element(*self.USERNAME), keys='xxxxx')
        self.send_keys(webElement=self.find_element(*self.PASSWORD), keys='xxxxx')
        self.find_element(*self.SUBMIT_BTN).click()

测试类

test.py

# -*- coding: utf-8 -*-

"""
  @desc: 测试类
  @author: Amio_
  @file: test.py
  @date: 2017/12/18 12:06
"""
from sat.ui.base.browser_engine import BrowserEngine
from sat.ui.pom.login_page import LoginPage


class Test(object):
    driver = BrowserEngine().init_driver()  #  浏览器引擎初始化(实现方式往下看...)

    def test_login(self):
        LoginPage(driver=self.driver).login()  # 调用登录方法,可复用
        self.driver.quit()  # 注意, 结束操作一定要调用quit()方法,否则进程一直在

我是用py.test框架执行的, py.test -q test.py

拓展

浏览器引擎实现方法,请点击我
项目Github下载地址

你可能感兴趣的:(自动化测试)