一、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. Java中的Redis 哨兵高可用性

    让我们探索Redis Sentinel,看看如何在Java上运行它,一起来看看,最近get了很多新知识,分享给大家参考学习.需要详细的java架构思维导图路线也可以评论获取! 什么是Redis哨兵? ...

  2. 老板让阿粉学习 flink 中的 Watermark,现在他出教程了

    1 前言 在时间 Time 那一篇中,介绍了三种时间概念 Event.Ingestin 和 Process, 其中还简单介绍了乱序 Event Time 事件和它的解决方案 Watermark 水位线 ...

  3. 分布式事务框架-seata初识

    一.事务与分布式事务 事务,在数据库中指的是操作数据库的最小单位,往大了看,事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消. 那为什么会有分布式事务呢 ...

  4. 如何根据HttpServletRequets获取用户真实IP地址

    最近的一个项目的某个功能获取用户的ip地址,添加用户的系统使用记录. 我发现当我直接使用getRemoteAddr()方法从HttpServletRequet中获取用户的ip时,获取到的是服务器的ip ...

  5. 你对Java泛型的理解够深入吗?

    泛型 泛型提供了一种将集合类型传达给编译器的方法,一旦编译器知道了集合元素的类型,编译器就可以对其类型进行检查,做类型约束. 在没有泛型之前: /** * 迭代 Collection ,注意 Coll ...

  6. Thinkpad S440 I/O接口配置

    HDMI 视频接口 SS USB3.0接口 电源接口 音频接口 网络接口 没有com口可以用USB口,然后安装一个USB转com口的驱动.

  7. JS中如何比较两个数组,取得数组二相对于数组一新增和去除的元素

    //数组二相对于数组一所新增的数据 function add_msg(a,b){ return a.filter(function(i){ return b.indexOf(i) === -1 }) ...

  8. 怎么将文件夹上传到GitHub上

    1. 在GitHub上新建一个仓库地址: http://github.com/......git 2. 在需要上传的文件夹目录下,运行 git   init  初始化git: 3. 运行git  ad ...

  9. go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用)

    目录 go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用) warden direct demo-server gr ...

  10. 头条一面竟然问我Maven?

    maven package和maven install 有什么区别? 你常用的maven命令有哪些? <dependencyManagement> 是干什么的? 还有用过其它构建工具吗? ...