热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python+selenium十:selenium的二次封装

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

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)

推荐阅读
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
author-avatar
嘟嘟仔2286768
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有