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)的更多相关文章

  1. [Guava官方文档翻译] 5. Guava的Object公共方法 (Common Object Utilities Explained)

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3537367.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  2. SFTP环境搭建及客户代码调用公共方法封装

    一.背景 在开发应用软件的过程中,广泛使用FTP在各子系统间传送文本数据.但FTP存在安全问题,开放到外网存在安全漏洞,容易被攻击.替换方案是使用SFTP,SFTP提供更高的安全性,当然传输的效率也会 ...

  3. JS常用公共方法封装

    _ooOoo_ o8888888o 88" . "88 (| -_- |) O\ = /O ____/`---'\____ .' \\| |// `. / \\||| : |||/ ...

  4. Object 公共方法详解

    在C#中,所有类型最终都从System.Object派生,所以每个类型的每个对象都保证了一组最基本的方法.具体地说,System.Object提供了一组公共实例方法. 一.Equals 如果两个对象具 ...

  5. FTP环境搭建及客户代码调用公共方法封装

    一.背景 大型系统架构往往被分解为多个独立可运行的组件, 以满足性能.可靠性.可扩展性的需求.多个组件间的数据交互往往采用两种方式:小量数据通过Sock函数.RMI.WebService等接口方式传递 ...

  6. Page Object设计模式(一)

    一.简介 主要特点体现在“对界面交互细节的封装”上,使测试用例更专注于业务的操作,从而提高测试用例的可维护性.解决UI变动问题. page对象的一个基本原则经验法则是:凡是人能做的事,page对象通过 ...

  7. Python_Selenium 之以login_page为例实现对basepage封装好的方法调用和对common中公共方法的调用

    目的:简化代码,提供框架该有的东西每一个函数 -提供了一个功能 - 公共的功能有了basepage,在PageObjects当中直接调用元素操作. 以下以login_page 为例,实现从配置文件中读 ...

  8. angular 封装公共方法

    angular封装公共方法到service中间件,节省开发时间 layer.service.ts openAlert(callback) {// 传递回调函数 const dialogRef = th ...

  9. Object中有哪些公共方法及作用

    大家在学习java的时候,一定遇到过Object类,因为在java单一继承体系中Object类是根类,所有的类都会继承它,并拥有Object的公共方法,意味着在java的面向对象的世界中,所有对象都拥 ...

随机推荐

  1. sk-learn实现L2岭回归,对线性回归正则化

    岭回归算法: from sklearn.datasets import load_boston from sklearn.externals import joblib from sklearn.li ...

  2. 三步教你如何在Github部署自己的简历

    相信铁子们有很多都是将找工作的小白(和小编一样!!嘿嘿)小编也和在座的大家一样,一个普通的不能再普通的二本学生(北华大学) <  单身!单身!单身!> 听很多人都说:像我们这个样子,害!放 ...

  3. linux的p0f检测,分析抓包信息

    p0f是一个纯粹的被动指纹识别工具,它在不干涉双方通信的情况下,通过嗅探的方式来分析流经某一网卡的流量以达到指纹识别的目的 P0f是继Nmap和Xprobe2之后又一款远程操作系统被动判别工具.它支持 ...

  4. Spring5参考指南:AspectJ注解

    文章目录 什么是AspectJ注解 启用AOP 定义Aspect 定义Pointcut 切入点指示符(PCD) 切入点组合 Advice 访问JoinPoint Advice参数 Advice参数和泛 ...

  5. 安装并使用pyecharts库

    在cmd命令行中输入安装命令, pyecharts库的安装命令如下: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyecharts ...

  6. 三、通过Vue基础属性做一个Table的增加、删除、姓名音位吗查询

    html头文件包括css,和vue.js的文件的引用 <!DOCTYPE html> <html lang="en"> <head> <m ...

  7. JS面向对象编程之对象

    在AJAX兴起以前,很多人写JS可以说都是毫无章法可言的,基本上是想到什么就写什么,就是一个接一个的函数function,遇到重复的还得copy,如果一不小心函数重名了,还真不知道从何开始查找错误,因 ...

  8. MutationObserver 监听 DOM 树变化

    MutationObserver 是用于代替 MutationEvents 作为观察 DOM 树结构发生变化时,做出相应处理的 API .为什么要使用 MutationObserver 去代替 Mut ...

  9. Git初始化本地代码及提交到服务器

    2019独角兽企业重金招聘Python工程师标准>>> 1.先安装Git客户端 2.进入需要提交的文件夹目录 3.打开Git Bash,点击右键中的Git Bash 打开git命令窗 ...

  10. 推荐3个Python初学者学习Python案例

    回复资料,获取最新的Python的资料.想学习Python可以加微信回复报名. 希望今天的分享3个小案例,对你学习Python有帮助 Python 九九乘法表 以下实例演示了如何实现九九乘法表: 实例 ...