改进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的面向对象的世界中,所有对象都拥 ...
随机推荐
- 白话理解https
为什么需要加密? 因为http的内容是明文传输的,传输过程有可能被劫持或被篡改(中间人攻击),如何解决? 当然是加密.最简单的方式就是对称加密(快). 对称机密 就是一个密钥,可以理解为一把钥匙,我们 ...
- 基于 HTML WebGL 的会展中心智能监控系统
前言 随着近几年物联网.万物互联等诸多概念的大行其道,智慧城市的概念也早已经被人们耳熟能详,而作为城市的组成部分,智慧建筑也是重中之重,智慧园区,智慧小区等也如雨后春笋般的相继出现. 智慧建筑是指通过 ...
- 算法笔记刷题2(codeup 1928)
又磕了一晚上,多点测试真的很烦 ,完全不知道错哪里,后来发现是我变量名命名不规范导致自己晕了填错了,其实思路还是对的 我觉得书上的做法也还行,但我不太喜欢用二维数组,所以拿以前写的算天数的程序改装了一 ...
- php token验证范例
<?php $module = $_GET['module']; $action = $_GET['action']; $token = md5sum($module.date('Y-m-d', ...
- vue项目中上拉加载和下拉刷新页面的实现
功能:上拉加载,下拉刷新 使用方法: 自己创建一个.vue的文件(我自己是创建了一个PullToRefresh.vue的文件),将代码粘贴进去,具体的样式问题自己在该文件中调整. <templa ...
- SaltStack数据系统之Grains、Pillar
SaltStack数据系统之Grains.Pillar 1.什么是Grains? Grains是saltstack的组件,用于收集salt-minion在启动时候的信息,又称为静态信息.Grains是 ...
- Rabbit and Turtle
知乎上有这样一个问题:如果兔子都在拼命奔跑,是什么给了作为乌龟的你前进的动力? 随着视野的不断开阔,我们难免怀疑自身前进的意义,曾经有很长一段时间我也深陷其中,直到看到余亦多先生的回答才有所感悟. 问 ...
- Python爬虫---爬取抖音短视频
目录 前言 抖音爬虫制作 选定网页 分析网页 提取id构造网址 拼接数据包链接 获取视频地址 下载视频 全部代码 实现结果 待解决的问题 前言 最近一直想要写一个抖音爬虫来批量下载抖音的短视频,但是经 ...
- vue element select多选回显
我们经常在使用 Element组件里面的 select多选 场景:添加账号的时候需要选择可见分公司(分公司为多选),添加成功之后可以编辑,需要回显添加时所提交的分公司 代码如下: 多选框: data( ...
- C语言程序报告五
C程序设计实验报告 姓 名:赖瑾 实验地点:家 实验时间: 2020年4月21日 实验项目:6.3.1练习1 编写由三角形三边求面积的函数 6.3.1练习2 编写求N阶乘的函数 6.3.1练习3 求两 ...