一、BasePage介绍

  1. 创建一个BasePage类,对Selenium Api进行二次封装
  2. 为了快速创建项目并投产,用到的Selenium Api才进行封装,没用到的则不封装
  3. 优先封装最重要的几个方法:
    • 初始化webdriver
    • 元素定位(不封装元素操作方法,例如send_keys)
    • 浏览器加载页面

二、Selenium Api 二次封装


├── pages
│   ├── __init__.py
│   └── base_page.py
└── utils
└── __init__.py

base_page.py

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC DOMAIN = 'https://www.tapd.cn/'
TIMEOUT = 10
POLL_FREQUENCY = 0.5 class BasePage(): def __init__(self, driver=None, path=None):
self.driver = driver if driver != None else webdriver.Chrome()
self.get_url(path) def find_element(self, locator):
WebDriverWait(driver=self.driver, timeout=TIMEOUT, poll_frequency=POLL_FREQUENCY).until(
EC.visibility_of_element_located(locator))
return self.driver.find_element(*locator) def get_url(self, path=None):
if path != None:
url = URL + path
else:
url = None if url != None:
self.driver.get(url)

三、优化base_page

  1. DOMAIN,TIMEOUT,POLL_FREQUENCY这几个全局变量是随时可以改变的,我们称为魔法变量,会特意建一个文件存起来,命名为: constants.py ,本项目存放在utils目录 (所有的url也可放在单独的一个文件叫urls.py,区别于constants.py)。
  2. 编写一个dirver工具类(单例模式),实现只打开和关闭一次浏览器,存放在se_utils.py,用于管理启动不同的浏览器的开关。
├── pages
│   ├── __init__.py
│   └── base_page.py
├── run_case
│   └── __init__.py
└── utils
├── __init__.py
├── constants.py
└── se_utils.py

constants.py

DOMAIN = 'https://www.tapd.cn/'
LOGIN_URL = '/cloud_logins/login'
TIMEOUT = 10
POLL_FREQUENCY = 0.5

se_utils.py

from selenium import webdriver

class Driver():
_driver = None @classmethod
def get_driver(cls, browser_name='Chrome'):
if cls._driver == None:
if browser_name == 'Chrome':
cls._driver = webdriver.Chrome()
elif browser_name == 'Firefox':
cls._driver = webdriver.Firefox()
elif browser_name == 'Safari':
cls._driver == webdriver.Safari()
elif browser_name == 'Opera':
cls._driver == webdriver.Opera()
elif browser_name == 'edge':
cls._driver == webdriver.Edge()
elif browser_name == 'Ie':
cls._driver == webdriver.Ie()
else:
raise NameError(
"Not found %s browser,You can enter 'Chrome', 'Firefox', 'Ie', 'Edge', 'Safari',Opera" % browser_name)
return cls._driver @classmethod
def quit_driver(cls):
if cls._driver:
cls._driver.quit()
cls._driver = None

base_page.py

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC from utils.constants import TIMEOUT, POLL_FREQUENCY, DOMAIN
from utils.se_utils import Driver class BasePage(): def __init__(self, path=None):
self.driver = Driver.get_driver()
self.driver.maximize_window()
self.get_url(path) def find_element(self, locator):
WebDriverWait(driver=self.driver, timeout=TIMEOUT, poll_frequency=POLL_FREQUENCY).until(
EC.visibility_of_element_located(locator))
return self.driver.find_element(*locator) def get_url(self, path=None):
if path != None:
url = DOMAIN + path
else:
url = None if url != None:
self.driver.get(url)

四、其他页面继承BasePage

  1. 编写两个页面类,登录页和登陆成功后的首页
  2. 页面类里包含元素定位和用例

login_page.py

from base_page import BasePage, By
from home_page import HomePageAction class LoginPage(BasePage):
username_locator = (By.CSS_SELECTOR, '#username')
password_locator = (By.CSS_SELECTOR, '#password_input')
login_button = (By.CSS_SELECTOR, '#tcloud_login_button') def username_input_box(self):
return self.find_element(self.username_locator) def password_input_box(self):
return self.find_element(self.password_locator) def login_btn(self):
return self.find_element(self.login_button) class LoginPageAction(LoginPage): def login(self, username, password):
self.username_input_box().clear()
self.username_input_box().send_keys(username)
self.password_input_box().clear()
self.password_input_box().send_keys(password)
self.login_btn().click()
return HomePageAction()

home_page.py

from base_page import BasePage, By

class HomePage(BasePage):
user_title_locator = (By.CSS_SELECTOR, '.avatar-text-default.avatar-Q') def user_title(self):
return self.find_element(self.user_title_locator) class HomePageAction(HomePage): @property
def get_user_title(self):
return self.user_title().get_attribute('title')

Web自动化测试项目(二)BasePage实现的更多相关文章

  1. Web自动化测试项目搭建目录

    Web自动化测试项目搭建(一) 需求与设计 Web自动化测试项目(二)BasePage实现 Web自动化测试项目(三)用例的组织与运行 Web自动化测试项目(四)测试报告 Web自动化测试项目(五)测 ...

  2. Web自动化测试项目(四)测试报告

    测试报告生成 使用HTMLTestRunner 生成测试报告 本文使用的 HTMLTestRunner 来源于github: https://github.com/githublitao/HTMLTe ...

  3. Web自动化测试项目(七)日志

    一.日志作用 调试程序 了解系统程序运行的情况,是否正常 系统程序运行故障分析与问题定位 用来做用户行为分析和数据统计 二.为项目添加日志 └── utils ├── log_utils.py └── ...

  4. Web自动化测试项目(五)测试结果通知

    一.邮件通知 使用第三方邮件发送库yagmail github地址:https://github.com/kootenpv/yagmail 安装 pip3 install yagmail demo.p ...

  5. Web自动化测试项目搭建(一) 需求与设计

    一.项目需求 测试/生产环境更新后,自动化回归测试 项目易于维护和运行 支持多种测试策略 支持可视化测试报告 运行结果,支持多种方式通知相关人员 可定时/触发的方式运行自动化测试用例 二.设计 2.1 ...

  6. CukeTest+Puppeteer的Web自动化测试(二)

    上一篇我们讲了CukeTest+Puppeteer的相关理论知识,带大家认识熟悉了CukeTest如何运行与如何编写剧本,Puppeteer大体的理论体系与如何结合使用,但一直没有给大家进行上手实战操 ...

  7. selenium3 web自动化测试框架 二:页面基础操作、元素定位方法封装、页面操作方法封装

    学习目的: 掌握自动化框架中需要的一些基础web操作 正式步骤: 使用title_contains检查页面是否正确 # -*- coding:utf-8 -*- import time from se ...

  8. Web自动化测试项目(六)多环境执行

    需求 使用命令行运行脚本,可以指定测试/预发布/生产环境的url,如果找不到该环境变量则默认为测试环境 python3 xxxxxx.py test 修改constants.py # DOMAIN = ...

  9. Web自动化测试项目(三)用例的组织与运行

    一.Unittest用例组织 在test_case目录下创建test*.py,组织测试用例 ├── test_case │   ├── __init__.py │   └── test_login.p ...

随机推荐

  1. Django框架之中间件MiddleWare

    Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健 ...

  2. python知识点总结02(不定时更新)

    请用至少两种方式实现m与n值交换m=10,n=5 # 方式一 temp = 0 m = 10 n = 5 print(f'方式一交换前,m:{},n:{}') temp = m m = n n = t ...

  3. C# event 事件

    事件第二篇:https://www.cnblogs.com/FavoriteMango/p/11731485.html 曾经面试碰到一道设计题: 现有一个人,一群鸟,人有一把手枪,当人开枪时,所有的鸟 ...

  4. 中小型企业级 IPS 部署

    <构建基于Snort+Guardian+Iptables的IPS> 2020年的第三天,依旧如往常写文章,分享最近做的项目继<中小型企业级防火墙部署>之后的另一部分<构建 ...

  5. 简单聊一聊JS中的循环引用及问题

    本文主要从 JS 中为什么会出现循环引用,垃圾回收策略中引用计数为什么有很大的问题,以及循环引用时的对象在使用 JSON.stringify 时为什么会报错,怎样解决这个问题简单谈谈自己的一些理解. ...

  6. MySQL 持久化保障机制-redo 日志

    我们在 聊一聊 MySQL 中的事务及其实现原理 中提到了 redo 日志,redo 日志是用来保证 MySQL 持久化功能的,需要注意的是 redo 日志是 InnoDB 引擎特有的功能. 为什么 ...

  7. spring boot介绍

    spring boot简介 1.spring boot是spring家族中的一个全新的框架,它用来简化spring应用程序的创建和开发过程,也可以说spring boot能简化我们之前采用ssm框架进 ...

  8. 【转】21个免费的UI界面设计工具、资源及网站

    本文将介绍21个免费的UI界面设计工具.资源及网站,如果你在做用户体验设计.界面设计.产品设计.JS前段开发.手机产品设计以及iPad和平板电脑产品设计,不妨来看看. AD: 2013云计算架构师峰会 ...

  9. FastOne专业计算平台助力生命科学研发

    11月16日,由AWS主办的云计算行业沙龙在中油阳光酒店举行,速石科技CEO陈熹就高性能计算如何助力生命科学领域发表了精彩的演讲. 面临的问题及挑战 在算力及高性能领域,随着行业客户的业务需求量,数据 ...

  10. 单调队列优化 dp

    The only difference between easy and hard versions is the constraints. Vova likes pictures with kitt ...