Selenium二次封装-Python版本
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.select import Select '''
对selenium进行二次封装
'''
class PySelenium(object): '''
初始化,实例化浏览器驱动对象
'''
def __init__(self, browser='ff'):
if browser == 'ff' or browser == 'firefox': # 火狐
driver = webdriver.Firefox()
elif browser == 'chrome': # 谷歌
option = webdriver.ChromeOptions()
option.add_argument("--start-maximized")
driver = webdriver.Chrome(chrome_options=option)
elif browser == 'ie' | browser == 'internet explorer': # IE
driver = webdriver.Ie()
elif browser == "opera":
driver = webdriver.Opera()
elif browser == "phantomjs":
driver = webdriver.PhantomJS()
elif browser == 'edge':
driver = webdriver.Edge() try:
self.driver = driver
except Exception:
# 手动抛出异常
raise NameError(
"Not found %s browser,You can enter 'ie', 'ff', 'opera', 'phantomjs', 'edge' or 'chrome'." % browser) '''
设置元素等待
'''
def elementWait(self, css, secs=5):
# 判断表达式是否包含指定字符
if "=>" not in css:
raise NameError("Positioning syntax errors, lack of '=>'.") # 提取元素定位方式和定位表达式
by = css.split("=>")[0]
value = css.split("=>")[1] if by == "id":
WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located(By.ID,value))
elif by == 'name':
WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located(By.NAME,value))
elif by == "class":
WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located((By.CLASS_NAME, value)))
elif by == "link_text":
WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located((By.LINK_TEXT, value)))
elif by == "xpath":
WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located((By.XPATH, value)))
elif by == "css":
WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located((By.CSS_SELECTOR, value)))
else:
raise NameError(
"Please enter the correct targeting elements,'id','name','class','link_text','xpath','css'.") '''
获取指定元素对象
表达式: by=>value (by为定位方式,value为定位方式的表达式,例如:按照id定位某个元素,id=>"#")
'''
def getElement(self, css):
if "=>" not in css:
raise NameError("Positioning syntax errors, lack of '=>'.") by = css.split("=>")[0]
value = css.split("=>")[1] if by == 'id':
element = self.driver.find_element_by_id(value)
elif by == 'name':
element = self.driver.find_element_by_name(value)
elif by == 'class':
element = self.driver.find_element_by_class_name(value)
elif by == 'link_text':
element = self.driver.find_element_by_link_text(value)
elif by == 'xpath':
element = self.driver.find_element_by_xpath(value)
elif by == 'css':
element = self.driver.find_element_by_css_selector(value)
else:
raise NameError("Please enter the correct targeting elements,'id','name','class','link_text','xpath','css'.")
return element '''
请求/打开指定链接
'''
def openUrl(self, url):
self.driver.get(url) '''
窗口最大化
'''
def maxWindows(self):
self.driver.maximize_window() '''
设置窗口指定宽高
'''
def setWindowsSize(self, wide, high):
self.driver.set_window_size(width=wide,height=high) '''
添加文本到input
'''
def addText(self, css, massage):
self.elementWait(css)
input = self.getElement(css)
input.send_keys(massage) '''
清空input中的文本
'''
def clear(self, css):
self.elementWait(css)
self.getElement(css).clear() '''
鼠标左键单击
'''
def click(self, css):
self.elementWait(css)
self.getElement(css).click() '''
鼠标右键单击
'''
def rightClick(self, css):
self.elementWait(css)
ActionChains(self.driver).context_click(self.getElement(css)).perform() '''
移动鼠标到指定元素(默认在元素的中间位置)
'''
def moveToTargetElement(self, css):
self.elementWait(css)
ActionChains(self.driver).move_to_element(self.getElement(css)).perform() '''
移动鼠标到指定元素,并且指定位于元素的x,y偏移量(偏移量相对于元素的左上角)
'''
def moveToTargetElementWithOffset(self, css, xoffset, yoffset):
self.elementWait(css)
ActionChains(self.driver).move_to_element_with_offset(self.getElement(css), xoffset, yoffset).perform() '''
鼠标左键双击
'''
def doubleClick(self, css):
self.elementWait(css)
ActionChains(self.driver).double_click(self.getElement(css)).perform() '''
拖拽元素到指定元素处
'''
def dragAndDropToElement(self, sourceCss, targetCss):
self.elementWait(sourceCss)
self.elementWait(targetCss)
ActionChains(self.driver).drag_and_drop(self.getElement(sourceCss),self.getElement(targetCss)).perform() '''
拖拽元素指定偏移(该偏移是相对于当前鼠标的坐标偏移量)
'''
def dragAndDropToOffset(self, sourceCss, xoffset, yoffset):
self.elementWait(sourceCss)
ActionChains(self.driver).drag_and_drop_by_offset(self.getElement(sourceCss), xoffset, yoffset).perform() '''
鼠标左键点击链接文本
'''
def clickLinkText(self, text):
self.driver.find_element_by_partial_link_text(text).click() '''
关闭当前窗口
'''
def close(self):
self.driver.close() '''
关闭浏览器驱动
'''
def quit(self):
self.driver.quit() '''
提交指定表单
'''
def submit(self, css):
self.elementWait(css)
self.getElement(css).submit() '''
刷新当前页面,相当于点击F5
'''
def F5(self):
self.driver.refresh() '''
执行指定的js代码
'''
def js(self, javaScript):
self.driver.execute_script(javaScript) '''
获取指定元素的某个属性值
'''
def getAttribute(self, css, attr):
self.elementWait(css)
self.getElement(css).get_attribute(attr) '''
获取指定元素的文本内容,即value属性值
'''
def getText(self, css):
self.elementWait(css)
self.getElement(css).text '''
判断元素是否可见
'''
def isDisplay(self, css):
self.elementWait(css)
return self.getElement(css).is_displayed() '''
判断元素是否启用
'''
def isEnabled(self, css):
self.elementWait(css)
return self.getElement(css).is_enabled() '''
判断元素是否选中,一般用于验证checkbox和radio
'''
def isSelected(self, css):
self.elementWait(css)
return self.getElement(css).is_selected() '''
获取当前页面的title
'''
def getTitle(self):
return self.driver.title '''
获取当前页面的url
'''
def getCurrentUrl(self):
return self.driver.current_url '''
截图,保存到指定路径下文件中
'''
def getScreenshot(self, fullFileName):
self.driver.get_screenshot_as_file(fullFileName) '''
全局等待,Implicitly wait.All elements on the page.
'''
def wait(self, secs):
self.driver.implicitly_wait(secs) '''
弹框警告-确认
'''
def alertAccept(self):
# self.driver.switch_to_alert().accept() 废弃的方式
self.driver.switch_to.alert.accept() '''
弹框警告-取消
'''
def alertDismiss(self):
# self.driver.switch_to_alert().dismiss() 废弃的方式
self.driver.switch_to.alert.dismiss() '''
切换到指定的iframe
'''
def switchFrame(self, css):
self.elementWait(css)
self.driver.switch_to.frame(self.getElement(css)) '''
切换到上一级(iframe)
'''
def switchFrameOut(self):
self.driver.switch_to.default_content() '''
打开新页面,并切换当前句柄为新页面的句柄
(每个页面对应一个句柄handle,可以通过self.driver.window_handles查看所有句柄)
--当前方法可能存在问题
'''
def openNewWindow(self):
original_windows = self.driver.current_window_handle
all_handles = self.driver.window_handles
for handle in all_handles:
if handle != original_windows:
self.driver.switch_to.window(handle) '''
等待元素,默认5秒,每1秒检查一次
--如果超时则对当前页面截图,以指定的文件名称保存到图片存储目录,并返回false
'''
def waitEleAndSaveExceptionForTimeout(self, css, pictureName):
try:
self.elementWait(css)
return True
except Exception as e:
from conf.path import PICTUREPATH # 导入定义的图片存储目录路径
pictureFullName = PICTUREPATH + pictureName + '.jpg'
self.getScreenshot(pictureFullName)
return False '''
等待元素,10秒,每1秒检查一次
--如果超时,返回false
'''
def waitEleAndExceptionForTimeout(self, css):
try:
self.element_wait(css, secs=10)
return True
except Exception as e:
return False '''
根据指定的值选中相应的下拉列表中的选项
--如果没有指定的值则抛出异常
'''
def selectByValue(self, css, value):
self.element_wait(css)
Select(self.get_element(css)).select_by_value(value) if __name__ == '__main__':
pySelenium = PySelenium('chrome')
Selenium二次封装-Python版本的更多相关文章
- Selenium二次封装-Java版本
package com.yanfuchang.selenium.utils; import java.awt.AWTException; import java.awt.Robot; import j ...
- selenium + python自动化测试unittest框架学习(五)webdriver的二次封装
因为webdriver的api方法很长,再加上大多数的定位方式是以xpath方式定位,更加让代码看起来超级长,为了使整体的代码看起来整洁,对webdriver进行封装,学习资料来源于虫师的<se ...
- Python+Selenium中级篇之-二次封装Selenium中几个方法
本文来介绍,如何把常用的几个webdriver的方法封装到自己写的一个类中去,这个封装过程叫二次封装Selenium方法.我们把打开站点,浏览器前进和后退,关闭和退出浏览器这这个方法封装到一个新写的类 ...
- python+selenium十:selenium的二次封装
python+selenium十:基于原生selenium的二次封装 from selenium import webdriverfrom selenium.webdriver.support.w ...
- python+selenium十:基于原生selenium的二次封装
from selenium import webdriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium ...
- python mysql redis mongodb selneium requests二次封装为什么大都是使用类的原因,一点见解
1.python mysql redis mongodb selneium requests举得这5个库里面的主要被用户使用的东西全都是面向对象的,包括requests.get函数是里面每次都是实例 ...
- Python_selenium二次封装selenium的几个方法
Python_selenium二次封装selenium的几个方法 将常用的几个webdriver方法封装到自己写的一个类中去,此实例中是将"浏览器后退.浏览器前进.打开站点和关闭浏览器&qu ...
- python+selenium之自定义封装一个简单的Log类
python+selenium之自定义封装一个简单的Log类 一. 问题分析: 我们需要封装一个简单的日志类,主要有以下内容: 1. 生成的日志文件格式是 年月日时分秒.log 2. 生成的xxx.l ...
- Python实现Paramiko的二次封装
Paramiko是一个用于执行SSH命令的Python第三方库,使用该库可实现自动化运维的所有任务,如下是一些常用代码的封装方式,多数代码为半成品,只是敲代码时的备份副本防止丢失,仅供参考,目前本人巡 ...
随机推荐
- Redis源码解析(1)——源码目录介绍
概念 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有序集合).这些 ...
- Django pymysql学员管理系统
学员管理系统 项目规划阶段 项目背景 近年来老男孩教育的入学学员数量稳步快速增长,传统的excel统计管理学员信息的方式已经无法满足日渐增长的业务需求.因此公司急需一套方便易用的“学员管理系统”,来提 ...
- bzoj4513 储能表
求 $\sum\limits_{i=0}^{n-1} \sum\limits_{j=0}^{m-1} max((x \space xor \space j) - k,0)$ ,膜 $p$ $n,m \ ...
- CodeForces - 803F: Coprime Subsequences(莫比乌斯&容斥)
Let's call a non-empty sequence of positive integers a1, a2... ak coprime if the greatest common div ...
- 服务端缓存页面及IIS缓存设置
缓存信息基本概念 我们在看网页的header信息时,经常看到这几个参数:Expires.Cache-Control.Last-Modified.ETag,它们是RFC 2616(HTTP/1.1)协议 ...
- Java How to Iterate Map
常用iterate 方法 Map<Integer, String> m = new HashMap<Integer, String>(); for(Map.Entry<I ...
- bzoj 3887: Grass Cownoisseur Tarjan+Topusort
题目: 给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过?(一个点在路径中无论出现多少正整数次对答案的贡献均为1) 题解: 首先考虑简单 ...
- Monkey测试与MonkeyRunnner测试的区别
1.Monkey测试 == 压力测试: MonkeyRunner == 自动化测试 2.Monkey工具直接运行在设备或模拟器的adb shell中,生成用户或系统的伪随机事件 3.MonkeyRu ...
- 蓝桥杯 算法训练 ALGO-156 表达式计算
算法训练 表达式计算 时间限制:1.0s 内存限制:256.0MB 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输 ...
- 机器学习:线性回归法(Linear Regression)
# 注:使用线性回归算法的前提是,假设数据存在线性关系,如果最后求得的准确度R < 0,则说明很可能数据间不存在任何线性关系(也可能是算法中间出现错误),此时就要检查算法或者考虑使用其它算法: ...