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. 关于log4j、jul、jcl、slf4j等等日志组件的理解

    日志组件: 我们经常在开发项目的时候,需要打印记录项目过程中的一些日志.那我们经常大概会用到 log4j.jul.jcl.slf4j.simple.nop.logback 等等,那我们就详细介绍下这些 ...

  2. python 字符与数字如何转换

    python中字符与数字相互转换用chr()即可. python中的字符数字之间的转换函数 int(x [,base ])                               将x转换为一个整 ...

  3. webug3.0靶场渗透基础Day_1

    第一关: 最简单的get注入 单引号报错 http://192.168.129.136/pentest/test/sqli/sqltamp.php?gid=1' order by 5 --+     ...

  4. Spring5参考指南:基于注解的容器配置

    文章目录 @Required @Autowired @primary @Qualifier 泛型 @Resource @PostConstruct和@PreDestroy Spring的容器配置可以有 ...

  5. MYSQL隔离级别 与 锁

    1.四种隔离级别下数据不一致的情况   脏读 不可重复读 幻读 RU 是 是 是 RC(快照读) 否 是 是 RC(当前读) 否 否 是 RR(快照读) 否 否 是 RR(当前读) 否 否 否 Ser ...

  6. 这个linux命令能让时光倒流!你不知道的date隐藏用法

    文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 今天给项目写了个脚本需要获取前一天的时间,本来先获取今天的然后减一下, ...

  7. 【DNS域名解析命令】host

    host - DNS lookup utility host命令是常用的分析域名查询工具,可以用来测试域名系统工作是否正常. 语法: host [-aCdlnrsTwv] [-c class] [-N ...

  8. Linux中的常用快捷键

    tab 命令或路径补全键,linux里面最有用的快捷键,如果tab不到路径或命令,就代表没有这个路径或者命令,还有可能是权限不对 ctrl+c 终止当前任务命令或程序 ctrl+d 退出当前用户环境, ...

  9. python自动化测试开发利器ulipad最佳实践(可写python测试代码也可编写selenium、Appium等)...

    介绍 UliPad是一个国人开发的python轻量级编辑器,导向和灵活的编程器.它如类浏览器,代码自动完成许多功能,如:HTML查看器,目录浏览器,向导等. 下载与安装 下载地址:https://py ...

  10. uboot on qemu

    1, download uboot ftp://ftp.denx.de/pub/u-boot/ 2, compile uboot make vexpress_ca9x4_config export A ...