改进Page Object公共方法封装(base_page)
import os
from time import sleep from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys from common.log_utils import logger
from common.config_utils import ConfigUtils
from selenium.webdriver.support.wait import WebDriverWait class BasePage: def __init__(self, driver):
self.driver = driver def open_url(self, url):
"""
浏览器操作封装
"""
self.driver.get(url)
logger.info('打开url地址%s' % url) def quit_browser(self):
"""
关闭浏览器
"""
sleep(2)
self.driver.quit()
logger.info("关闭浏览器") def set_browser_max(self):
"""
浏览器最大化
"""
self.driver.maximize_window()
logger.info("设置浏览器最大化") def set_browser_min(self):
"""
浏览器最小化
"""
self.driver.minimize_window()
logger.info("设置浏览器最小化") def refresh(self):
"""
刷新浏览器
"""
self.driver.refresh()
logger.info("浏览器刷新操作") def get_title(self):
"""
获取网页标题
"""
value = self.driver.title
logger.info("获取网页标题,标题是%s" % value)
return value def set_driver(self):
self.set_browser_max()
self.open_url(ConfigUtils().test_url) def find_element(self, element_info):
"""
元素定位方法
"""
locator_element_name = element_info['element_name']
locator_type_name = element_info['locator_type']
locator_value_info = element_info['locator_value']
locator_timeout = element_info['timeout']
if locator_type_name == 'id':
locator_type = By.ID
elif locator_type_name == 'name':
locator_type = By.NAME
elif locator_type_name == 'xpath':
locator_type = By.XPATH
elif locator_type_name =='link_text':
locator_type = By.LINK_TEXT
elif locator_type_name == 'css_selector':
locator_type = By.CSS_SELECTOR
element = WebDriverWait(self.driver, int(locator_timeout))\
.until(lambda x: x.find_element(locator_type, locator_value_info))
logger.info("%s元素识别成功" % locator_element_name)
# element = WebDriverWait(self.driver, locator_timeout)\
# .until(EC.presence_of_element_located(locator_type, locator_value_info))
return element def click(self, element_info):
"""
元素点击操作
"""
self.find_element(element_info).click()
logger.info('%s点击操作成功' % element_info['element_name']) def input(self, element_info, content):
"""
元素输入操作
"""
self.find_element(element_info).send_keys(content)
logger.info("%s 输入内容【%s】" % (element_info['element_name'], content)) def target_locator(self):
"""
下拉至底部
"""
sleep(2)
js = "var q=document.documentElement.scrollTop=10000"
self.driver.execute_script(js)
logger.info("下拉至底部") # 表单切换
def frame_switch(self, frame_name=None):
"""
表单切换
"""
if frame_name is None:
print("Please enter the form element to jump to")
logger.info("没有输入页面元素")
else:
frame_name = self.find_element(frame_name)
self.driver.switch_to.frame(frame_name)
sleep(2)
logger.info("跳转至%s表单" % frame_name['element_name']) def frame_default_content(self):
"""
切回初始表单
"""
self.driver.switch_to.default_content()
sleep(2) # 句柄切换
def get_current_handle(self):
"""
获取当前句柄
"""
current_windows = self.driver.current_window_handle
title = self.driver.title
logger.info('获取%s句柄' % title)
return str(current_windows) def go_other_handle(self, current_handles):
"""
前往别的表单
"""
for handle in self.driver.window_handles:
if handle != current_handles:
self.driver.switch_to.window(handle)
title = self.driver.title
logger.info('前往%s' % title) def go_beginning_handle(self, current_handle):
"""
返回初始表单
"""
self.driver.switch_to.window(current_handle)
title = self.driver.title
logger.info('返回%s' % title) # 警告框
def get_alert(self):
alert = self.driver.switch_to.alert
sleep(2)
alert_text = alert.text
alert.accept()
logger.info('接受警告框,警告框内容为%s' % alert_text) # 鼠标操作
def mouse_operation(self, element_info, mouse_operate):
"""
鼠标操作
"""
above = self.find_element(element_info)
if mouse_operate == 'context_click':
ActionChains(self.driver).context_click(above).perform()
elif mouse_operate == 'double_click':
ActionChains(self.driver).double_click(above).perform()
elif mouse_operate == 'move_to_element':
ActionChains(self.driver).move_to_element(above).perform()
logger.info("正在进行%s" % mouse_operate) def drag_element(self, element_info, element_info2):
"""
鼠标拖动操作
"""
drag = self.find_element(element_info)
drop = self.find_element(element_info2)
ActionChains(self.driver).drag_and_drop(drag, drop).perform()
logger.info("正在将%s拖动至%s" % (element_info['element_name'], element_info2['element_name'])) # 键盘操作
def key_enter(self, element_info):
"""
回车
"""
self.find_element(element_info).send_keys(Keys.ENTER)
logger.info("对%s进行回车" % element_info['element_name']) def key_ctrl_a(self, element_info):
"""
全选
"""
self.find_element(element_info).send_keys(Keys.CONTROL, 'a')
logger.info("对%s全选" % element_info['element_name']) def key_ctrl_c(self, element_info):
"""
复制
"""
self.find_element(element_info).send_keys(Keys.CONTROL, 'c')
logger.info("对%s复制" % element_info['element_name']) def key_ctrl_v(self, element_info):
"""
粘贴
"""
self.find_element(element_info).send_keys(Keys.CONTROL, 'v')
logger.info("对%s粘贴" % element_info['element_name']) def key_ctrl_x(self, element_info):
"""
剪切
"""
self.find_element(element_info).send_keys(Keys.CONTROL, 'x')
logger.info("对%s剪切" % element_info['element_name'])
创建 BasePage类作为所有 Page 类的基类,在 BasePage 类中封装一些方法,这些方法是我们在做自动化时经常用到的。
- open_url()方法用于打开网页,它接收一个 url 参数;
- quit_browser()方法是当我们执行完测试用例后,可以使用这个方法进行浏览器关闭;
- set_browser_max()设置浏览器最大化
- set_browser_min()设置浏览器最小化
- refresh()刷新浏览器
...
当然,后续可能还会更加优化这个类,使功能越来越强大
logger.info()是日志封装后的方法;
import os
import logging current_path = os.path.dirname(__file__) # 获取文件当前路径
log_path = os.path.join(current_path, '../logs/log.txt') class LogUtils:
def __init__(self, log_file_path=log_path):
self.log_file_path = log_file_path
self.logger = logging.getLogger(__name__)
self.logger.setLevel(level=logging.INFO)
console = logging.StreamHandler()
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
console.setFormatter(formatter) file_log = logging.FileHandler(log_path)
file_log.setFormatter(formatter)
self.logger.addHandler(console)
self.logger.addHandler(file_log) def info(self, message):
self.logger.info(message) def error(self, message):
self.logger.error(message) logger = LogUtils() if __name__ == '__main__':
# log_utils = LogUtils()
logger.info('hello, word')
改进Page Object公共方法封装(base_page)的更多相关文章
- [Guava官方文档翻译] 5. Guava的Object公共方法 (Common Object Utilities Explained)
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3537367.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...
- SFTP环境搭建及客户代码调用公共方法封装
一.背景 在开发应用软件的过程中,广泛使用FTP在各子系统间传送文本数据.但FTP存在安全问题,开放到外网存在安全漏洞,容易被攻击.替换方案是使用SFTP,SFTP提供更高的安全性,当然传输的效率也会 ...
- JS常用公共方法封装
_ooOoo_ o8888888o 88" . "88 (| -_- |) O\ = /O ____/`---'\____ .' \\| |// `. / \\||| : |||/ ...
- Object 公共方法详解
在C#中,所有类型最终都从System.Object派生,所以每个类型的每个对象都保证了一组最基本的方法.具体地说,System.Object提供了一组公共实例方法. 一.Equals 如果两个对象具 ...
- FTP环境搭建及客户代码调用公共方法封装
一.背景 大型系统架构往往被分解为多个独立可运行的组件, 以满足性能.可靠性.可扩展性的需求.多个组件间的数据交互往往采用两种方式:小量数据通过Sock函数.RMI.WebService等接口方式传递 ...
- Page Object设计模式(一)
一.简介 主要特点体现在“对界面交互细节的封装”上,使测试用例更专注于业务的操作,从而提高测试用例的可维护性.解决UI变动问题. page对象的一个基本原则经验法则是:凡是人能做的事,page对象通过 ...
- Python_Selenium 之以login_page为例实现对basepage封装好的方法调用和对common中公共方法的调用
目的:简化代码,提供框架该有的东西每一个函数 -提供了一个功能 - 公共的功能有了basepage,在PageObjects当中直接调用元素操作. 以下以login_page 为例,实现从配置文件中读 ...
- angular 封装公共方法
angular封装公共方法到service中间件,节省开发时间 layer.service.ts openAlert(callback) {// 传递回调函数 const dialogRef = th ...
- Object中有哪些公共方法及作用
大家在学习java的时候,一定遇到过Object类,因为在java单一继承体系中Object类是根类,所有的类都会继承它,并拥有Object的公共方法,意味着在java的面向对象的世界中,所有对象都拥 ...
随机推荐
- python数据结构之栈的构建
class Stack(object): def __init__(self): self.stack=[] def pop(self): return self.stack.pop() def pu ...
- 用python把技术文档中,每个模块系列截图生成一个动态GIF
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 最近在写技术文档的时候,发现一个问题.对于每个技术步骤,都需要一个截图,这 ...
- git .gitignore不生效
原因是.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的. 解决方法: 1.先把规则写好,然后把规则对应的文件删了,然后 ...
- [redis]SDS和链表
一.SDS 1.SDS结构体 redis3.2之前:不管buf的字节数有多少,都用 4字节的len来储存长度,对于只存短字符串那么优点浪费空间,比如只存 name,则len=4 则只需要一个字节8位即 ...
- Spring Cloud sleuth with zipkin over RabbitMQ教程
文章目录 Spring Cloud sleuth with zipkin over RabbitMQ demo zipkin server的搭建(基于mysql和rabbitMQ) 客户端环境的依赖 ...
- Scala教程之:Option-Some-None
文章目录 Option和Some Option和None Option和模式匹配 在java 8中,为了避免NullPointerException,引入了Option,在Scala中也有同样的用法. ...
- Pycharm中设置encoding
在Pycharm专业版中,为了防止文件在别的机器上出现乱码,所以需要进行字符编码的设置. 首先在Pycharm中的View中将下图中的Toolbar打上勾. 接着,工具栏就会出现,选中settings ...
- 【Linux网络基础】网络子网划分基础知识(IP地址,子网)
一. IP地址分类与子网划分基础 1. 什么是IP地址? 常见的ip地址版本为ipv4, ipv6 32位 4 * 8=32位. 32位二进制数字序列组成的数字序列 点分十进制 采用点将32位数字 ...
- 如何在Vue项目中优雅的使用sass
开始之前,请先确保有一个基于webpack模板的项目(vue-cli脚手架一键安装~) 1.打开项目终端,安装sass的依赖包 npm install --save-dev sass-loader / ...
- HDU - 1253 胜利大逃亡 (搜索)
Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0 ...