博文章节
本机环境介绍
编码语言(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