一、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. IntelliJ IDEA使用说明

    1.IntelliJ IDEA简介: IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提 ...

  2. FPM简介(定制rpm包)

    FPM简介 fpm是生成rpm包的工具.rpm包的制作,采用fpm工具完成,FPM非常易用,此命令可以把rpm包的安装.卸载做得更加优雅,在安装前可以做一些准备工作,安装后可以做一些收尾工作,在卸载前 ...

  3. 小白进阶之路-python格式化输出

    1.不使用格式化前:传值时比较麻烦而且不精确. 2.格式化输出后,%代表先占个位,s代表字符串,%s代表这里之后会传一个字符串类型的值,%s其实可以接受任意类型的值:%d传入的值要求必须是数字. %s ...

  4. win服务器管理工具,服务器vps管理

    win系列服务器,vps桌面如何管理?用这个工具: IIS7远程桌面批量管理,同时管理上千台vps,服务器,3389远程端口.

  5. gcc 命令详解

    1. gcc -E source_file.c-E,只执行到预编译.直接输出预编译结果. 2. gcc -S source_file.c -S,只执行到源代码到汇编代码的转换,输出汇编代码. 3. g ...

  6. Java线程池学习总结

    一 使用线程池的好处 池化技术相比大家已经屡见不鲜了,线程池.数据库连接池.Http 连接池等等都是对这个思想的应用.池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率. 线程池提供了 ...

  7. AVR单片机教程——ADC

    ADC 计算机的世界是0和1的.单片机可以通过读取0和1来确定按键状态,也可以输出0和1来控制LED.即使是看起来不太0和1的PWM,好像可以输出0到5V之间的电压一样,达到0和1之间的效果,但本质上 ...

  8. css部分概念

    1.层叠 规则之间属性相同,值不同的时候就会发生声明冲突,这个时候层叠就会起作用了,层叠会将我们声明的不同的值进行保留,相同的值进行比较,选权重值更高的一个来运行.具体情境如下:假设我们定义了一个di ...

  9. 【Java基础总结】GUI

    GUI(Graphical User Interface),图形用户接口 CLI(Command Line User Interface),命令行用户接口 1. 容器 Container GUI主要位 ...

  10. 快速搭建一个自己的个人博客(Github Pages~二次元主题)

    前言 本次的一个布局技术都写的非常详细了,只要按着来就行,不过,先说明本次主题为二次元主题. 如果真的喜欢本主题的不妨可以试一试(==建议跟据目录来看==) 在很久很久以前.... 嘛,就在前不久我正 ...