python+selenium十:基于原生selenium的二次封装

 
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
# BY的用法
# driver.find_element("id", "kw")
# driver.find_element(By.ID, "kw") class Bace():
'''基于原生的selenium做二次封装''' def __init__(self, driver:webdriver.Firefox): # driver:webdriver.Firefox:映射driver 为webdriver.Firefox
self.driver = driver
self.timeout = 10
self.t = 0.5 def find(self, locator, value=''):
''' 定位到元素,返回元素对象,没定位到,Timeout异常 loctor 传元祖,如("id", "kw") '''
if not isinstance(locator, tuple):
print('locator参数类型错误,必须传元祖类型:loc = ("id", "value1")')
else:
print(f"正在定位元素信息:定位方式->{locator[0]}, 元素值->{locator[1]},value值->{value}")
if value != '': # value值定位
ele = WebDriverWait(self.driver, self.timeout, self.t).until(EC.text_to_be_present_in_element_value(locator, value))
return ele
else: # 默认为此常规定位方法
ele = WebDriverWait(self.driver, self.timeout, self.t).until(EC.presence_of_element_located(locator))
if ele:
return ele
else:
print(f"定位失败:定位方式->{locator[0]}, value值->{locator[1]}")
return False def finds(self, locator, value=''):
''' 定位到元素,返回元素对象,没定位到,Timeout异常 loctor 传元祖,如("id", "kw") '''
if not isinstance(locator, tuple):
print('locator参数类型错误,必须传元祖类型:loc = ("id", "value1")')
else:
print(f"正在定位元素信息:定位方式->{locator[0]}, 元素值->{locator[1]},value值->{value}")
if value != '': # value值定位
eles = WebDriverWait(self.driver, self.timeout, self.t).until(EC.text_to_be_present_in_element_value(locator, value))
return eles
else: # 默认为此常规定位方法
eles = WebDriverWait(self.driver, self.timeout, self.t).until(EC.presence_of_element_located(locator))
if eles:
return eles
else:
print(f"定位失败:定位方式->{locator[0]}, value值->{locator[1]}")
return [] def sendKeys(self, locator, text):
try:
self.find(locator).send_keys(text)
except:
print(f"输入 {text} 失败") def click(self, locator):
try:
self.find(locator).click()
except:
print("点击失败") def clear(self, locator):
try:
self.find(locator).clear()
except:
print("清空内容失败") def isSelected(self, locator, Type=''):
''' 判断元素是否被选中,返回bool值 及点(选中/取消选中)'''
ele = self.find(locator)
try:
if Type == '': # 如果type参数为空,返回元素是否为选中状态,True/False (默认)
r = ele.is_selected()
return r
elif Type == 'click': # 如果type参数为click,执行元素的点击操作
ele.click()
else:
print(f"type参数 {Type} 错误,仅可为click或''")
except:
return False def isElementExist(self, locator):
''' 判断单个元素是否在DOM里面 (是否存在)'''
try:
self.find(locator)
return True
except:
return False def isElementExists(self, locator):
''' 判断一组元素是否在DOM里面 (是否存在),若不存在,返回一个空的list'''
eles = self.finds(locator)
n = len(eles)
if n == 0:
return False
elif n == 1:
return True
else:
print(f"定位到元素的个数:{n}")
return True def title(self, title, Type='contains'):
''' 根据传入的type类型判断title '''
try:
if Type == 'is': # 判断当前网页title名为title 返回bool值
result = WebDriverWait(self.driver, self.timeout, self.t).until(EC.title_is(title))
return result
elif Type == 'contains': # 判断当前网页title名含title 返回bool值 (默认)
result = WebDriverWait(self.driver, self.timeout, self.t).until(EC.title_contains(title))
return result
else:
print(f"type参数 {Type} 错误,仅可为is、contains")
except:
return False def in_element(self, locator, value, Type='text'):
''' 根据传入的type判断内容是否在指定元素里面 '''
if not isinstance(locator, tuple):
print('locator参数类型错误,必须传元祖类型:loc = ("id", "value1")')
try:
if Type == 'text': # 判断当前获取到的text含value 返回bool值 (默认)
result = WebDriverWait(self.driver, self.timeout, self.t).until(EC.text_to_be_present_in_element(locator, value))
return result
elif Type == 'value': # 判断当前获取到的value含value 返回bool值, value为空字符串,返回False
result = self.find(locator, value)
return result
else:
print(f"type参数 {Type} 错误,仅可使用text或value属性定位")
return False
except:
return False def alert(self, timeout=3, Type=''):
''' 根据传入的type判断alert弹窗及操作 '''
result = WebDriverWait(self.driver, timeout, self.t).until(EC.alert_is_present())
try:
if Type == '': # 判断alert是否存在,如果有,就返回alert对象 (默认)
if result:
return result
else:
print("alert不存在")
return False
elif Type == 'yes': # 执行alert的确定按钮
result.accept()
elif Type == 'no': # 执行alert的取消按钮
result.dismiss()
else:
print(f"type参数 {Type} 错误,仅可为yes、no、或''")
except:
return False def get(self, locator, Type='text', name=''):
''' 根据传入的type判断获取指定的内容 (title、text、attribute)
type==attribute: 获取元素属性 name:属性 className、name、text、value··· '''
try:
if Type == 'title': # 获取当前网页 title
return self.driver.title
elif Type == 'text': # 获取元素文本值(默认)
return self.find(locator).text
elif Type == 'attribute': # 获取当前元素属性
return self.find(locator).get_attribute(name)
else:
print(f"给的type参数 {Type} 错误,仅可用title、text、attribute")
except:
print(f"获取 {Type} 值失败")
return '' def select(self, locator, value, Type='index'):
''' 下拉选项框 根据传入的type值判断(index、value、text) '''
element = self.find(locator) # 定位select这一栏
try:
if Type == 'index': # 用下标选择 (默认)
Select(element).select_by_index(value)
elif Type == 'value': # 根据value值选择
Select(element).select_by_value(value)
elif Type == 'text': # 根据选项的文本内容选择
Select(element).select_by_visible_text(value)
else:
print(f"给的type参数 {Type} 错误,仅可为:int、text、value")
except:
print(f"根据 {value} 操作下拉框失败") def iframe(self, id_index_locator):
''' 常规切换 iframe'''
try:
if isinstance(id_index_locator, int): # 如果传入的是数字,则以该数字为下标取值
self.driver.switch_to.frame(id_index_locator)
elif isinstance(id_index_locator, str): # 如果传入的是字符串,则用iframe名字取值
self.driver.switch_to.frame(id_index_locator)
elif isinstance(id_index_locator, tuple): # 如果是元祖,则根据传入的locator取值
ele = self.find(id_index_locator)
self.driver.switch_to.frame(ele)
except:
print("iframe切换异常") def handle(self, value):
''' 句柄切换,index、句柄名 '''
try:
if isinstance(value, int): # 切换到该下标对应的窗口
handles = driver.window_handles
self.driver.switch_to.window(handles[value])
elif isinstance(value, str): # 切换到该句柄名称对应的窗口
self.driver.switch_to.window(value)
else:
print(f"传入的type参数 {value} 错误,仅可传int、str")
except:
print(f"根据 {value} 获取句柄失败") def move_to_element(self, locator):
''' 鼠标悬停操作 '''
try:
ele = self.find(locator)
ActionChains(self.driver).move_to_element(ele).perform()
except:
print("鼠标悬停操作失败")
return False
'''==============================js与jQuery相关=====================================''' def js_focus_element(self, locator):
''' 聚焦元素 '''
target = self.find(locator)
self.driver.execute_script("arguments[0].scrollIntoView();", target) def js_scroll_top(self):
''' 滚动到顶部 '''
js = "window.scrollTo(0,0)"
self.driver.execute_script(js) def js_scroll_end(self, x=0):
''' 滚动到底部 '''
js = f"window.scrollTo({x},document.body.scrollHeight)"
self.driver.execute_script(js) def js_find(self, action):
''' js查找元素,并做相应操作(默认id属性) 输入值:value='XXX' 点击:click() '''
js = f"document.getElementById(“id”).{action}"
self.driver.execute_script(js) def js_finds(self, Type, element, index, action):
''' js查找元素,并做相应操作 输入值:value='XXX' 点击:click()
js定位仅可为:id、Name、TagName、ClassName、Selector(CSS) '''
list = ['Name', 'TagName', 'ClassName', 'Selector']
if type in list:
print(f"正在执行js操作:定位方式->{Type}, 元素值->{element}, 下标值->{index}, 执行操作->{action}")
if type == 'Selector':
js = f'document.query{Type}All("{element}"){index}.{action}'
else:
js = f'document.getElementsBy{Type}({element})[{index}].{action};'
self.driver.execute_script(js)
else:
print(f"type参数 {Type} 错误,js定位仅可为:'Name'、'TagName'、'ClassName'、'Selector'(CSS)") def js_readonly(self, idElement, value):
''' 去掉只读属性,并输入内容 一般为id '''
js = f'document.getElementById({idElement}).removeAttribute("readonly");document.getElementById({idElement}).value="{value}"'
driver.execute_script(js) def js_iframe(self, Type, element, action, index=''):
''' Js处理iframe 无需先切换到iframe上,再切回来操作
输入值:value='' 点击:click() type=id时,index='' '''
js = f'document.getElementBy{Type}({element}){index}.contentWindow.document.body.{action}'
driver.execute_script(js)
'''
jquery = '$(CSS).val("XXX");' # 根据css语法定位到元素,输入内容
jquery = '$(CSS).val('');' # 清空
jquery = '$(CSS).click();' # 点击
driver.execute_script(jquery)
''' # def switch_alert(self):
# ''' 获取alert弹窗 '''
# r = self.is_alert()
# if not r:
# print("alert不存在")
# else:
# return r # def is_title(self, title):
# '''判断当前title名为title 返回bool值'''
# try:
# result = WebDriverWait(self.driver, self.timeout, self.t).until(EC.title_is(title))
# return result
# except:
# return False
# def is_title_contains(self, title):
# '''判断当前title名含title 返回bool值'''
# try:
# result = WebDriverWait(self.driver, self.timeout, self.t).until(EC.title_contains(title))
# return result
# except:
# return False # def is_text_in_element(self, locator, _text=''):
# '''判断当前获取到的text含_text='' 返回bool值'''
# if not isinstance(locator, tuple):
# print('locator参数类型错误,必须传元祖类型:loc = ("id", "value1")')
# try:
# result = WebDriverWait(self.driver, self.timeout, self.t).until(EC.text_to_be_present_in_element(locator, _text))
# return result
# except:
# return False
# def is_value_in_element(self, locator, _value=''):
# '''返回bool值, value为空字符串,返回False'''
# if not isinstance(locator, tuple):
# print('locator参数类型错误,必须传元祖类型:loc = ("id", "value1")')
# try:
# result = WebDriverWait(self.driver, self.timeout, self.t).until(EC.text_to_be_present_in_element_value(locator, _value))
# return result
# except:
# return False # def get_title(self):
# '''获取title'''
# return self.driver.title
# def get_text(self, locator):
# '''获取文本'''
# try:
# t = self.find(locator).text
# return t
# except:
# print("获取text失败,返回'' ")
# return ""
# def get_attribute(self, locator, name):
# '''获取属性'''
# try:
# element = self.find(locator)
# return element.get_attribute(name)
# except:
# print("获取%s属性失败,返回'' "%name)
# return "" # def select_by_index(self, locator, index=0):
# '''通过索引,index是索引第几个,从0开始,默认选第一个'''
# element = self.find(locator) # 定位select这一栏
# Select(element).select_by_index(index) # def select_by_value(self, locator, value):
# '''通过value属性'''
# element = self.find(locator)
# Select(element).select_by_value(value) # def select_by_text(self, locator, text):
# '''通过文本值定位'''
# element = self.find(locator)
# Select(element).select_by_visible_text(text) # def switch_handle_window_name(self, window_name):
# ''' 根据句柄名字切换句柄 '''
# self.driver.switch_to.window(window_name)
# def switch_handle_index(self, index):
# ''' 根据句柄下标切换句柄 '''
# handles = driver.window_handles
# self.driver.switch_to.window(handles[index]) # def js_find(self, action):
# '''
# 输入值:value='XXX' 点击:click()
# '''
# print("正在执行js操作,操作行为:%s"%action)
# js = "document.getElementById(“id”).%s"%action
# self.driver.execute_script(js) if __name__ == "__main__":
driver = webdriver.Firefox()
driver.get("")
zentao = Base(driver)
# loc1 = (By.ID, "account")
# loc2 = (By.CSS_SELECTOR, "[name='password']")
# loc3 = (By.XPATH, "//*[@id='submit']") loc1 = ("id", "account")
loc2 = ("css selector", "[name='password']")
loc3 = ("xpath", "//*[@id='submit']")
zentao.sendKeys(loc2, 123) zentao.move_to_element(loc3)

python+selenium十:selenium的二次封装的更多相关文章

  1. Python+Selenium中级篇之-二次封装Selenium中几个方法

    本文来介绍,如何把常用的几个webdriver的方法封装到自己写的一个类中去,这个封装过程叫二次封装Selenium方法.我们把打开站点,浏览器前进和后退,关闭和退出浏览器这这个方法封装到一个新写的类 ...

  2. 《手把手教你》系列基础篇(九十七)-java+ selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程)

    1.简介 上一篇宏哥介绍了如何设计支持不同浏览器测试,宏哥的方法就是通过来切换配置文件设置的浏览器名称的值,来确定启动什么浏览器进行脚本测试.宏哥将这个叫做浏览器引擎类.这个类负责获取浏览器类型和启动 ...

  3. python+selenium十:基于原生selenium的二次封装

    from selenium import webdriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium ...

  4. selenium + python自动化测试unittest框架学习(五)webdriver的二次封装

    因为webdriver的api方法很长,再加上大多数的定位方式是以xpath方式定位,更加让代码看起来超级长,为了使整体的代码看起来整洁,对webdriver进行封装,学习资料来源于虫师的<se ...

  5. Selenium二次封装-Python版本

    from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from seleni ...

  6. Python_selenium二次封装selenium的几个方法

    Python_selenium二次封装selenium的几个方法 将常用的几个webdriver方法封装到自己写的一个类中去,此实例中是将"浏览器后退.浏览器前进.打开站点和关闭浏览器&qu ...

  7. python+selenium—webdriver入门(二)

    本文中主要介绍webdriver常见的对象定位方法: 一.对象定位的目的 二.常见的对象定位方法 一.对象定位的目的: 1.操作对象 2.获得对象的属性,如:对象的class属性.name属性等 3. ...

  8. Selenium二次封装-Java版本

    package com.yanfuchang.selenium.utils; import java.awt.AWTException; import java.awt.Robot; import j ...

  9. Python3 Selenium自动化web测试 ==> 第十一节 WebDriver高级应用 -- 显示等待 + 二次封装

    学习目的: 掌握显示等待 掌握二次封装 正式步骤: step1:显示等待的代码示例 # -*- coding:utf-8 -*- from selenium import webdriver from ...

随机推荐

  1. Kafka之Producer

    通过https://www.cnblogs.com/tree1123/p/11243668.html 已经对consumer有了一定的了解.producer比consumer要简单一些. 一.旧版本p ...

  2. linux细节操作的

    一>安装mysql 可以直接在linux系统下载 下载之前要安装wget插件 下载命令 wget 后面跟安装软件的url 比如mysql wget http://repo.mysql.com/m ...

  3. error LNK2001: unresolved external symbol "__declspec(dllimport)

    作为C++的小白,出现这个错误,是最头痛的.针对这种问题,我搜了网上的相关答案,很多都是在教Project ---> Settings中改动相关设置.我改了之后,问题依旧没有解决.后面查了这种问 ...

  4. 《Java 8 in Action》Chapter 1:为什么要关心Java 8

    自1998年 JDK 1.0(Java 1.0) 发布以来,Java 已经受到了学生.项目经理和程序员等一大批活跃用户的欢迎.这一语言极富活力,不断被用在大大小小的项目里.从 Java 1.1(199 ...

  5. 在Docker for Windows中运行GUI程序

    Docker运行GUI原理 Docker目前大多应用在服务器领域,那么在Docker中可以运行GUI程序吗?怀着好奇心google了一番,还真有人写了一篇文章 running-gui-applicat ...

  6. 从一道没人能答对的面试题聊聊Java的值传递

    这是一道我们公司的面试题,从招第二个Java以来就一直存在了.但是面试了这么长的时间还没有一个人可以全部答对,让我们一度以为是这题出的不对.首先请看面试题. 以下运算的输出分别是多少: ```java ...

  7. python 35 多线程

    目录 多线程 1. 线程 2. 线程vs进程 3. 开启线程的两种方法. 4. 线程的特性 5. 线程的相关方法 6. join 阻塞 7. 守护线程 daemon 8. 互斥锁 多线程 1. 线程 ...

  8. Codeforces 1004D

    题意略. 思路: 有两个点要注意一下: 1.这个菱形矩阵是8对称的,也即可以是沿45°对角线对称. 2.菱形矩阵上的数字表明了这个点到中心0点的距离,这对于确定位置有帮助. 这个题目简直刷新人生观,这 ...

  9. 前端H5与安卓和ios之间通信

    在一些app场景中,经常看到app里面嵌套H5页面, 安卓和ios提供一个空壳子,方法两者互相调用.上一周就是写H5页面让安卓和ios调用使用,中间传参,接受参数.通过 window.wx 对象调用一 ...

  10. 基于wanAndroid-项目实战

    # QzsWanAndroid - [基于 wanandroid.com 开发的 MVP + Retrofit2 + RxJava2 +okhttp3 开发的 Android APP](https:/ ...