您的位置:首页 > 移动开发 > Objective-C

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

2017-12-18 15:37 1286 查看

博文章节

博文章节
本机环境介绍

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<
4000
/p>

# -*- 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下载地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息