#coding=gbk
import os
import time
from selenium import webdriver
from selenium.webdriver.common.by import By #导入by方法
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains ##对鼠标事件操作
from selenium.webdriver.common.keys import Keys # 对键盘事件操作
from common import HTMLTestReportCN #测试报告
from common.log_utils import logger
from common.config_utils import config

class BasePage(object):
def __init__(self,driver):
self.driver=driver

# ------ -------------------------------------浏览器操作封装----------------------------------------------#
#打开网页
def open_url(self,url):
self.driver.get(url)
logger.info('打开URL地址%s;'%url)

def set_browser_max(self):
self.driver.maximize_window()
logger.info("设置浏览器的最大化")

def close_tab(self):
self.driver.close()
logger.info('关闭当前的tab页签')

def set_brower_min(self):
self.driver.minimize_window()
logger.info("设置浏览器的最小化")

def brower_refresh(self):
self.driver.refresh()
logger.info("浏览器的刷新操作")

def get_title(self):
value=self.driver.title
logger.info("获取网页的标题为:%s"%value)
return value

def quit_brower(self):
self.driver.quit()
logger.info("关闭浏览器")

# ------ ------------------------------------- 等待封装---------------------------------------------------#
#测试OK
def implicitly_wait(self,seconds=config.get_timeout):
self.driver.implicitly_wait(seconds)

def wait(self,seconds=config.get_timeout):
time.sleep(seconds)

# ------ ------------------------------------- 元素识别的封装----------------------------------------------#
def find_element(self,element_info):
try:
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=='class':
locator_type=By.CLASS_NAME
elif locator_type_name=='xpath':
locator_type=By.XPATH
# 识别元素
element=WebDriverWait(self.driver,locator_timeout)\
.until(lambda x:x.find_element(locator_type,locator_value_info))
logger.info('[%s]元素识别成功'%element_info['element_name'])
except Exception as e:
logger.error('[%s]元素不能识别,原因是%s' % (element_info['element_name'], e.__str__()))
self.screenshot_as_file() # 失败后截屏
return element

# ------ -------------------------------------获取属性封装----------------------------------------------#
#获取元素属性封装-测试OK
def get_element_attribute(self,element_info,attribute_name):
element=self.find_element(element_info)
value=element.get_attribute(attribute_name)
logger.info('[%s]元素的%s的值为:%s'%(element_info['element_name'],attribute_name,value))
return value

#获取元素text属性封装-测试OK
def get_text(self,element_info):
text=self.find_element(element_info).text
logger.info('[%s]元素的text值为:%s'%(element_info['element_name'],text))
return text

#------ ------------------------------------- 鼠标事件封装----------------------------------------------#
#元素鼠标操作封装:-测试OK
def click(self,element_info):
element=self.find_element(element_info)
logger.info('[%s]元素进行点击操作'%element_info['element_name'])
element.click()

#元素鼠标操作:右击-测试OK
def context_click(self,element_info):
mouse = ActionChains(self.driver)
element = self.find_element(element_info)
logger.info('[%s]元素进行右击操作' % element_info['element_name'])
mouse.context_click(element).perform()

#元素鼠标操作:移动到该元素上--测试OK
def move_to_element_by_mouse(self,element_info):
element = self.find_element(element_info)
mouse = ActionChains(self.driver)
logger.info('将鼠标移动到[%s]元素上' % element_info['element_name'])
mouse.move_to_element(element).perform()

def long_press_element(self,element_info,senconds):
element = self.find_element(element_info)
logger.info('将鼠标长按到[%s]元素上后松开' % element_info['element_name'])
mouse = ActionChains(self.driver)
mouse.click_and_hold(element).pause(senconds).release(element)

def scrollIntoView(self,element_info):
element=self.find_element(element_info)
logger.info('将滚动条滚动至[%s]元素可见'%element_info['element_name'])
self.driver.execute_script('arguments[0].scrollIntoView();', element)
time.sleep(1)

# ------ ------------------------------------- 键盘事件封装-------------------------------------------#
# #键盘事件操作封装:输入内容--OK
def input(self,element_info,content):
element=self.find_element(element_info)
element.send_keys(content)
logger.info('[%s]元素输入内容:%s'%(element_info['element_name'],content))

#删除内容-测试OK
def back_space(self,element_info):
element=self.find_element(element_info)
logger.info('[%s]元素操作back_space' % (element_info['element_name']))
element.send_keys(Keys.BACK_SPACE)

#清空内容--测试OK
def clear_input(self,element_info):
element=self.find_element(element_info)
logger.info('[%s]元素输入框操作清空' % (element_info['element_name']))
element.clear()

#按回车--测试OK
def enter(self,element_info):
element=self.find_element(element_info)
logger.info('[%s]元素进行回车键操作' % (element_info['element_name']))
element.send_keys(Keys.ENTER)

#全选 Ctrl+a--测试OK
def ctrl_a(self,element_info):
element=self.find_element(element_info)
logger.info('[%s]元素输入框内容进行全选操作' % (element_info['element_name']))
element.send_keys(Keys.CONTROL, 'a')

#粘贴 Ctrl +x--测试OK
def ctrl_x(self,element_info):
element=self.find_element(element_info)
logger.info('[%s]元素输入框内容进行剪切操作' % (element_info['element_name']))
element.send_keys(Keys.CONTROL, 'x')

#粘贴 Ctrl +v--测试OK
def ctrl_v(self,element_info):
element=self.find_element(element_info)
logger.info('[%s]元素输入框内容进行粘贴操作' % (element_info['element_name']))
element.send_keys(Keys.CONTROL, 'v')

# ------ ------------------------------------- 弹窗封装----------------------------------------------#
#弹窗处理封装-测试OK
def get_alert_content(self,action='accept',timeout=config.get_timeout):
WebDriverWait(self.driver, timeout).until(EC.alert_is_present())
alter = self.driver.switch_to.alert
value = alter.text
logger.info('当前弹窗的内容为:%s' % value)
if action == 'accept':
alter.accept()
elif action == 'dismiss':
alter.dismiss()
return value

# ------ -------------------------------------frame封装-----------------------------------------------#
#frame封装frame == > id/name frame元素对象
#思路一
def switch_to_frame(self,element_info):
element = self.find_element(element_info)
self.driver.switch_to.frame(element)
logger.info('[%s]frame元素切换成功' %(element_info["element_name"]))

#思路二
def switch_to_frame_id_or_name(self,id_or_name):
self.driver.switch_to.frame(id_or_name)
def switch_to_frame_by_element(self,element_info):
element = self.find_element(element_info)
self.driver.switch_to.frame(element)
logger.info('[%s]frame元素切换成功' % (element_info["element_name"]))

#------------------------------------selenium执行js封装-----------------------------------------------#
def execute_script(self,js_str,element_info=None):
if element_info:
self.driver.execute_script(js_str)
else:
self.driver.execute_script(js_str,None)

def delete_element_attribute(self,element_info,attribute_name):
element = self.find_element(element_info)
self.driver.execute_script('arguments[0].removeAttribute("%s");'%attribute_name,element)

def update_element_attribute(self, element_info, attribute_name,attribute_value):
element = self.find_element(element_info)
self.driver.execute_script('arguments[0].setAttribute("%s","%s");' %(attribute_name,attribute_value), element)

# ------ -------------------------------------切换句柄封装-------------------------------------------#
##方式一--测试OK
def switch_window_by_title(self,title):
for handle in self.driver.window_handles:
self.driver.switch_to.window(handle)
if self.driver.title.__contains__(title):
break
logger.info('切换到网页标题为[%s]的句柄成功!'%title)

#方式二--测试OK
def switch_window_by_url(self,url):
for handle in self.driver.window_handles:
self.driver.switch_to.window(handle)
if self.driver.current_url.__contains__(url):
break
logger.info('切换到URL为[%s]的句柄成功!' % url)

#----------------------------截图封装----------------------------------------------------------#
#测试OK
# def screenshot_as_file_old(self, *screenshot_path):
# current_dir = os.path.dirname(__file__)
# if len(screenshot_path) == 0:
# screenshot_filepath = config.screenshot_path
# else:
# screenshot_filepath = screenshot_path[0]
# now = time.strftime('%Y_%m_%d_%H_%M_%S')
# screenshot_filepath_finally = os.path.join(current_dir, '../' ,screenshot_filepath, 'UITest_%s.png' % now)
# self.driver.get_screenshot_as_file(screenshot_filepath_finally)
# logger.info('图片截取成功')

#如果要在测试报告中截图,需要使用这个截图封装
def screenshot_as_file(self):
report_path = os.path.join( os.path.abspath(os.path.dirname(__file__)) , '..', config.report_path)
report_dir = HTMLTestReportCN.ReportDirectory(report_path)
report_dir.get_screenshot( self.driver )

  

Python_Selenium之basepage 识别元素、浏览器操作、获取属性、鼠标事件、键盘事件、弹窗、切换frame、切换句柄等封装的更多相关文章

  1. Selenium:浏览器及鼠标、键盘事件

    参考文档:WebDriver官方文档,下载链接:http://download.csdn.net/detail/kwgkwg001/4004500 虫师:<selenium2自动化测试实战-基于 ...

  2. 『心善渊』Selenium3.0基础 — 12、Selenium操作鼠标和键盘事件

    目录 (一)对鼠标的操作 1.鼠标事件介绍 2.ActionChains 类鼠标操作的常用方法 3.perform()方法 4.鼠标事件操作步骤 5.示例 (1)右键单击.左键双击 (2)鼠标拖拽动作 ...

  3. (转)python selenium-webdriver 元素操作之鼠标和键盘事件

    参考资料:https://blog.csdn.net/zh175578809/article/details/76767748 参考资料2:https://blog.csdn.net/qq_41817 ...

  4. chrome浏览器页面获取绑定返回顶部动画事件插件

    在chrome浏览器下页面加载: var top = $("body").scrollTop()  ; console.log(top)                      ...

  5. java获取键盘事件

    转 <script type="text/javascript" language=JavaScript charset="UTF-8"> docu ...

  6. UI自动化测试(二)浏览器操作及对元素的定位方法(xpath定位和css定位详解)

    Selenium下的Webdriver工具支持FireFox(geckodriver). IE(InternetExplorerDriver).Chrome(ChromeDriver). Opera( ...

  7. python实例编写(1)--浏览器操作,元素操作

    一.浏览器操作 1.  back()与 forward() #coding=gbk //编码不一定是utf-8 from selenium import webdriver //导入包,也叫”模组“ ...

  8. Javascript入门(二)变量、获取元素、操作元素

    一.变量 Javascript 有五种基本数据类型 number.String.boolean.undefined.null 一种复合类型:object 二.使用getElementById方法获取元 ...

  9. selenium常用操作,查找元素,操作Cookie,获取截图,获取窗口信息,切换,执行js代码

    目录: 1. 常用操作 2. 查找元素 3. 操作Cookie 4. 获取截图 5. 获取窗口信息 6. 切换 7. 执行JS代码 简介 selenium.webdriver.remote.webdr ...

随机推荐

  1. hdu5256序列变换(非递减子序列)

    题意(中文直接粘吧)序列变换 Problem Description     我们有一个数列A1,A2...An,你现在要求修改数量最少的元素,使得这个数列严格递增.其中无论是修改前还是修改后,每个元 ...

  2. Linux下抓包命令tcpdump的使用

    在linux下,可以使用 tcpdump 命令来抓取数据包. 主要用法如下: 过滤网卡 tcpdump -i eth0 #抓取所有经过网卡eth0数据包 tcpdump -i lo #抓取环回口的数据 ...

  3. UVA11174村民排队问题

    题意:      有n个人要排队,给你一些父子关系,要求儿子不能站在自己的父亲前面,问有多少种排队方式? 思路:       白书上的题目,首先我们可以把关系建成树,这样我们就有可能得到一个森林(或者 ...

  4. 网络原理常用CMD命令字

    1. 运行"ipconfig/all"命令,将命令运行结果截图贴上来,并指出本机IP地址和网关IP 2. 运行"ping"命令,目标参数分别是 邻居IP.com ...

  5. C#事件总线

    目录 简介 实现事件总线 定义事件基类 定义事件参数基类 定义EventBus 使用事件总线 事件及事件参数 定义发布者 定义订阅者 实际使用 总结 参考资料 简介 事件总线是对发布-订阅模式的一种实 ...

  6. 跟我一起学Go系列:gRPC 入门必备

    RPC 的定义这里就不再说,看文章的同学都是成熟的开发.gRPC 是 Google 开源的高性能跨语言的 RPC 方案,该框架的作者 Louis Ryan 阐述了设计这款框架的动机,有兴趣的同学可以看 ...

  7. Spring-Cloud之Ribbon原理剖析

    我们知道Ribbon主要的工作就是进行负载均衡,帮助我们无需再关注微服务中集群的地址信息,因此在源码剖析中我们就主要关注这部分的内容. 内置的负载均衡规则 RoundRobinRule:直接轮询的方案 ...

  8. (转)通过gitlab统计git提交的代码量

    git的代码量大多数都是根据命令行统计,或者根据第三方插件统计.但是都不满足我的需求,因为我们代码都由gitlab管理,于是想到了通过gitlab暴露出来的接口获取数据. 第一步,生成私钥 登录你的g ...

  9. .NET程序崩溃了怎么抓 Dump ? 我总结了三种方案

    一:背景 1. 讲故事 最近几天接到了几个crash的求助,可能这几个朋友没玩过怎么去生成dump,只能手把手教,感觉也不是一个办法,所以有必要总结一下,后续再有朋友咨询的话,我就可以把这篇文章丢过去 ...

  10. 适用于windows10 Linux子系统的安装管理配置 How To Management Windows Subsystem for Linux WSL

    什么是WSL Windows Subsystem for Linux 简称WLS,适用于Linux的Windows子系统,可以直接在Windows上运行Linux环境(包括大部分命令行工具) Linu ...