一、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. Flask框架知识点整合

    Flask 0.Flask简介 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收ht ...

  2. 十三、springboot 优雅集成spring-boot-admin 实现程序监控

    前言 我们知道项目的监控是尤为重要的,但是我们如果用jdk 自带的jconsole 和jvisualvm 的话会非常繁琐,且界面不是很友好.之前我们使用了spring boot 项目,但是都没有对项目 ...

  3. $loj\ 2031\ [SDOI2016]$数字配对 网络流

    正解:网络流 解题报告: 我永远喜欢$loj$! 显然先预处理哪些$a$之间可以连边,然后考虑建两排点,连流量为$c_{i}\cdot c_{j}$,然后$ST$连$inf$,跑个费用流? 然后现在碰 ...

  4. 你的IDEA过期了?跃哥四大招帮你稳住

    作者:Dimple Solgan:当你的才华还无法撑起你的野心时候,那应该静下心来好好学习 前天晚上在群里风风火火组建了两个学习小组,一个是面向Java初学,一个是面向Python初学,把我搞的兴奋不 ...

  5. js中的事件冒泡

    事件冒泡和阻止事件冒泡: 事件冒泡的原理:从实际操作的元素(事件)向上级父元素一级一级执行下去,直到达到document/window,冒泡过程结束.例如:假设我有一个 div 盒子,里面嵌套了1个子 ...

  6. Activity启动过程源码分析(Android 8.0)

    Activity启动过程源码分析 本文来Activity的启动流程,一般我们都是通过startActivity或startActivityForResult来启动目标activity,那么我们就由此出 ...

  7. ACID特性及幻读的理解

    事务是关系型数据库的重要特性.它是一个包含了一条或多条SQL语句的逻辑原子单元.一个事务包含的SQL要么全部提交,要么全部回滚. Oracle 官方文档中对事务的描述如下: A transaction ...

  8. Markdown 复杂公式&常用符号

    公式格式 行内公式 行内公式(不会换行)使用 $ 作为起止符,例如:$a + b = c$, 效果为:\(a + b = c\) 块级公式 块级公式(单独一行)使用 $$ 作为起止符,例如:$$a + ...

  9. Go Web 编程之 Hello World

    概述 计划写一个讲 Go Web 编程的系列文章.从基于 net/http 包编写 Go Web 程序开始,讲述处理器,请求,响应等基础知识.然后到框架的使用.中间会穿插一些源码的分析.最后做一个实战 ...

  10. 7个效果震憾的HTML5应用组件

    在HTML5的世界里,任何文本.图像都可以变得令人难以想象,很多HTML5应用也都已经随着浏览器的升级而变得运行飞速,而且兼容性也越来越好.下面为大家介绍7款效果震憾的HTML5应用组件,HTML5是 ...