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. 数值计算方法实验之Lagrange 多项式插值 (Python 代码)

    一.实验目的 在已知f(x),x∈[a,b]的表达式,但函数值不便计算,或不知f(x),x∈[a,b]而又需要给出其在[a,b]上的值时,按插值原则f(xi)= yi(i= 0,1…….,n)求出简单 ...

  2. PyTorch中在反向传播前为什么要手动将梯度清零?

    对于torch中训练时,反向传播前将梯度手动清零的理解 简单的理由是因为PyTorch默认会对梯度进行累加.至于为什么PyTorch有这样的特点,在网上找到的解释是说由于PyTorch的动态图和aut ...

  3. java 递归及其经典应用--求阶乘、打印文件信息、计算斐波那契数列

    什么是递归 我先看下百度百科的解释: 一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的.用递归过程定义的函数,称为递归函数,例如连加.连乘及阶乘等.凡是递归的函数,都是可计算的,即 ...

  4. DBeaver数据表的拷贝过程

    通过DBeaver工具链接数据库后,我们就可以通过菜单或者命令功能来实现我们想要的目的. (一)创建数据库 新建数据库,如下图所示:  ——> 在点击“确定”按钮后,可能会遇到失败,此时,我们可 ...

  5. Iterator to list的三种方法

    目录 简介 使用while 使用ForEachRemaining 使用stream 总结 Iterator to list的三种方法 简介 集合的变量少不了使用Iterator,从集合Iterator ...

  6. WebLogic上的项目无法更新,删除项目缓存

    /root/bea/user_projects/domains/base_domain/servers/AdminServer/tmp/ /root/bea/user_projects/domains ...

  7. office 365 激活

    将以下代码复制到记事本 @echo off title Activate Microsoft Office ALL versions &echo - Microsoft Office Prof ...

  8. SSH公钥登录和RSA非对称加密

    SSH登录方式 接触过Linux服务器的同学肯定用过SSH协议登录系统,通常SSH协议都有两种登录方式:密码口令登录和公钥登陆. 一.密码口令(类似于账号密码登录) 1.客户端连接服务器,服务器把公钥 ...

  9. MySQL使用ProxySQL实现读写分离

    1 ProxySQL简介: ProxySQL是一个高性能的MySQL中间件,拥有强大的规则引擎.官方文档:https://github.com/sysown/proxysql/wiki/下载地址:ht ...

  10. CentOS 7 网络优化(升级内核、开启 BBR)

    我之前介绍过关于 TCP 一些优化,包括安装使用 TCP 优化软件,这些适用于较低版本的 CentOS 系统,例如 CentOS 6,详细可参考<Linux 下的一些简单的 TCP 优化> ...