Selenium二次封装-Python版本

  1 from selenium import webdriver
  2 from selenium.webdriver.support.wait import WebDriverWait
  3 from selenium.webdriver.support import expected_conditions as EC
  4 from selenium.webdriver.common.by import By
  5 from selenium.webdriver.common.action_chains import ActionChains
  6 from selenium.webdriver.support.select import Select
  7
  8 ‘‘‘
  9     对selenium进行二次封装
 10 ‘‘‘
 11 class PySelenium(object):
 12
 13     ‘‘‘
 14         初始化,实例化浏览器驱动对象
 15     ‘‘‘
 16     def __init__(self, browser=‘ff‘):
 17         if browser == ‘ff‘ or browser == ‘firefox‘: # 火狐
 18             driver = webdriver.Firefox()
 19         elif browser == ‘chrome‘: # 谷歌
 20             option = webdriver.ChromeOptions()
 21             option.add_argument("--start-maximized")
 22             driver = webdriver.Chrome(chrome_options=option)
 23         elif browser == ‘ie‘ | browser == ‘internet explorer‘: # IE
 24             driver = webdriver.Ie()
 25         elif browser == "opera":
 26             driver = webdriver.Opera()
 27         elif browser == "phantomjs":
 28             driver = webdriver.PhantomJS()
 29         elif browser == ‘edge‘:
 30             driver = webdriver.Edge()
 31
 32         try:
 33             self.driver = driver
 34         except Exception:
 35             # 手动抛出异常
 36             raise NameError(
 37                 "Not found %s browser,You can enter ‘ie‘, ‘ff‘, ‘opera‘, ‘phantomjs‘, ‘edge‘ or ‘chrome‘." % browser)
 38
 39
 40     ‘‘‘
 41         设置元素等待
 42     ‘‘‘
 43     def elementWait(self, css, secs=5):
 44         # 判断表达式是否包含指定字符
 45         if "=>" not in css:
 46             raise NameError("Positioning syntax errors, lack of ‘=>‘.")
 47
 48         # 提取元素定位方式和定位表达式
 49         by = css.split("=>")[0]
 50         value = css.split("=>")[1]
 51
 52         if by == "id":
 53             WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located(By.ID,value))
 54         elif by == ‘name‘:
 55             WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located(By.NAME,value))
 56         elif by == "class":
 57             WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located((By.CLASS_NAME, value)))
 58         elif by == "link_text":
 59             WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located((By.LINK_TEXT, value)))
 60         elif by == "xpath":
 61             WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located((By.XPATH, value)))
 62         elif by == "css":
 63             WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located((By.CSS_SELECTOR, value)))
 64         else:
 65             raise NameError(
 66                 "Please enter the correct targeting elements,‘id‘,‘name‘,‘class‘,‘link_text‘,‘xpath‘,‘css‘.")
 67
 68     ‘‘‘
 69         获取指定元素对象
 70             表达式:  by=>value (by为定位方式,value为定位方式的表达式,例如:按照id定位某个元素,id=>"#")
 71     ‘‘‘
 72     def getElement(self, css):
 73         if "=>" not in css:
 74             raise NameError("Positioning syntax errors, lack of ‘=>‘.")
 75
 76         by = css.split("=>")[0]
 77         value = css.split("=>")[1]
 78
 79         if by == ‘id‘:
 80             element = self.driver.find_element_by_id(value)
 81         elif by == ‘name‘:
 82             element = self.driver.find_element_by_name(value)
 83         elif by == ‘class‘:
 84             element = self.driver.find_element_by_class_name(value)
 85         elif by == ‘link_text‘:
 86             element = self.driver.find_element_by_link_text(value)
 87         elif by == ‘xpath‘:
 88             element = self.driver.find_element_by_xpath(value)
 89         elif by == ‘css‘:
 90             element = self.driver.find_element_by_css_selector(value)
 91         else:
 92             raise NameError("Please enter the correct targeting elements,‘id‘,‘name‘,‘class‘,‘link_text‘,‘xpath‘,‘css‘.")
 93         return element
 94
 95     ‘‘‘
 96         请求/打开指定链接
 97     ‘‘‘
 98     def openUrl(self, url):
 99         self.driver.get(url)
100
101     ‘‘‘
102         窗口最大化
103     ‘‘‘
104     def maxWindows(self):
105         self.driver.maximize_window()
106
107     ‘‘‘
108         设置窗口指定宽高
109     ‘‘‘
110     def setWindowsSize(self, wide, high):
111         self.driver.set_window_size(width=wide,height=high)
112
113     ‘‘‘
114         添加文本到input
115     ‘‘‘
116     def addText(self, css, massage):
117         self.elementWait(css)
118         input = self.getElement(css)
119         input.send_keys(massage)
120
121     ‘‘‘
122         清空input中的文本
123     ‘‘‘
124     def clear(self, css):
125         self.elementWait(css)
126         self.getElement(css).clear()
127
128     ‘‘‘
129         鼠标左键单击
130     ‘‘‘
131     def click(self, css):
132         self.elementWait(css)
133         self.getElement(css).click()
134
135     ‘‘‘
136         鼠标右键单击
137     ‘‘‘
138     def rightClick(self, css):
139         self.elementWait(css)
140         ActionChains(self.driver).context_click(self.getElement(css)).perform()
141
142     ‘‘‘
143         移动鼠标到指定元素(默认在元素的中间位置)
144     ‘‘‘
145     def moveToTargetElement(self, css):
146         self.elementWait(css)
147         ActionChains(self.driver).move_to_element(self.getElement(css)).perform()
148
149     ‘‘‘
150         移动鼠标到指定元素,并且指定位于元素的x,y偏移量(偏移量相对于元素的左上角)
151     ‘‘‘
152     def moveToTargetElementWithOffset(self, css, xoffset, yoffset):
153         self.elementWait(css)
154         ActionChains(self.driver).move_to_element_with_offset(self.getElement(css), xoffset, yoffset).perform()
155
156     ‘‘‘
157         鼠标左键双击
158     ‘‘‘
159     def doubleClick(self, css):
160         self.elementWait(css)
161         ActionChains(self.driver).double_click(self.getElement(css)).perform()
162
163     ‘‘‘
164         拖拽元素到指定元素处
165     ‘‘‘
166     def dragAndDropToElement(self, sourceCss, targetCss):
167         self.elementWait(sourceCss)
168         self.elementWait(targetCss)
169         ActionChains(self.driver).drag_and_drop(self.getElement(sourceCss),self.getElement(targetCss)).perform()
170
171     ‘‘‘
172         拖拽元素指定偏移(该偏移是相对于当前鼠标的坐标偏移量)
173     ‘‘‘
174     def dragAndDropToOffset(self, sourceCss, xoffset, yoffset):
175         self.elementWait(sourceCss)
176         ActionChains(self.driver).drag_and_drop_by_offset(self.getElement(sourceCss), xoffset, yoffset).perform()
177
178     ‘‘‘
179         鼠标左键点击链接文本
180     ‘‘‘
181     def clickLinkText(self, text):
182         self.driver.find_element_by_partial_link_text(text).click()
183
184     ‘‘‘
185         关闭当前窗口
186     ‘‘‘
187     def close(self):
188         self.driver.close()
189
190     ‘‘‘
191         关闭浏览器驱动
192     ‘‘‘
193     def quit(self):
194         self.driver.quit()
195
196     ‘‘‘
197         提交指定表单
198     ‘‘‘
199     def submit(self, css):
200         self.elementWait(css)
201         self.getElement(css).submit()
202
203     ‘‘‘
204         刷新当前页面,相当于点击F5
205     ‘‘‘
206     def F5(self):
207         self.driver.refresh()
208
209     ‘‘‘
210         执行指定的js代码
211     ‘‘‘
212     def js(self, javaScript):
213         self.driver.execute_script(javaScript)
214
215     ‘‘‘
216         获取指定元素的某个属性值
217     ‘‘‘
218     def getAttribute(self, css, attr):
219         self.elementWait(css)
220         self.getElement(css).get_attribute(attr)
221
222     ‘‘‘
223         获取指定元素的文本内容,即value属性值
224     ‘‘‘
225     def getText(self, css):
226         self.elementWait(css)
227         self.getElement(css).text
228
229     ‘‘‘
230         判断元素是否可见
231     ‘‘‘
232     def isDisplay(self, css):
233         self.elementWait(css)
234         return self.getElement(css).is_displayed()
235
236     ‘‘‘
237         判断元素是否启用
238     ‘‘‘
239     def isEnabled(self, css):
240         self.elementWait(css)
241         return self.getElement(css).is_enabled()
242
243     ‘‘‘
244         判断元素是否选中,一般用于验证checkbox和radio
245     ‘‘‘
246     def isSelected(self, css):
247         self.elementWait(css)
248         return self.getElement(css).is_selected()
249
250     ‘‘‘
251         获取当前页面的title
252     ‘‘‘
253     def getTitle(self):
254         return self.driver.title
255
256     ‘‘‘
257         获取当前页面的url
258     ‘‘‘
259     def getCurrentUrl(self):
260         return self.driver.current_url
261
262     ‘‘‘
263         截图,保存到指定路径下文件中
264     ‘‘‘
265     def getScreenshot(self, fullFileName):
266         self.driver.get_screenshot_as_file(fullFileName)
267
268     ‘‘‘
269         全局等待,Implicitly wait.All elements on the page.
270     ‘‘‘
271     def wait(self, secs):
272         self.driver.implicitly_wait(secs)
273
274     ‘‘‘
275         弹框警告-确认
276     ‘‘‘
277     def alertAccept(self):
278         # self.driver.switch_to_alert().accept() 废弃的方式
279         self.driver.switch_to.alert.accept()
280
281     ‘‘‘
282         弹框警告-取消
283     ‘‘‘
284     def alertDismiss(self):
285         # self.driver.switch_to_alert().dismiss() 废弃的方式
286         self.driver.switch_to.alert.dismiss()
287
288     ‘‘‘
289         切换到指定的iframe
290     ‘‘‘
291     def switchFrame(self, css):
292         self.elementWait(css)
293         self.driver.switch_to.frame(self.getElement(css))
294
295     ‘‘‘
296         切换到上一级(iframe)
297     ‘‘‘
298     def switchFrameOut(self):
299         self.driver.switch_to.default_content()
300
301     ‘‘‘
302         打开新页面,并切换当前句柄为新页面的句柄
303         (每个页面对应一个句柄handle,可以通过self.driver.window_handles查看所有句柄)
304         --当前方法可能存在问题
305     ‘‘‘
306     def openNewWindow(self):
307         original_windows = self.driver.current_window_handle
308         all_handles = self.driver.window_handles
309         for handle in all_handles:
310             if handle != original_windows:
311                 self.driver.switch_to.window(handle)
312
313
314     ‘‘‘
315         等待元素,默认5秒,每1秒检查一次
316             --如果超时则对当前页面截图,以指定的文件名称保存到图片存储目录,并返回false
317     ‘‘‘
318     def waitEleAndSaveExceptionForTimeout(self, css, pictureName):
319         try:
320             self.elementWait(css)
321             return True
322         except Exception as e:
323             from conf.path import PICTUREPATH  # 导入定义的图片存储目录路径
324             pictureFullName = PICTUREPATH + pictureName + ‘.jpg‘
325             self.getScreenshot(pictureFullName)
326             return False
327
328     ‘‘‘
329         等待元素,10秒,每1秒检查一次
330             --如果超时,返回false
331     ‘‘‘
332     def waitEleAndExceptionForTimeout(self, css):
333         try:
334             self.element_wait(css, secs=10)
335             return True
336         except Exception as e:
337             return False
338
339     ‘‘‘
340         根据指定的值选中相应的下拉列表中的选项
341             --如果没有指定的值则抛出异常
342     ‘‘‘
343     def selectByValue(self, css, value):
344         self.element_wait(css)
345         Select(self.get_element(css)).select_by_value(value)
346
347 if __name__ == ‘__main__‘:
348     pySelenium = PySelenium(‘chrome‘)

原文地址:https://www.cnblogs.com/wang1001/p/9556134.html

时间: 2024-11-12 18:36:39

Selenium二次封装-Python版本的相关文章

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

因为webdriver的api方法很长,再加上大多数的定位方式是以xpath方式定位,更加让代码看起来超级长,为了使整体的代码看起来整洁,对webdriver进行封装,学习资料来源于虫师的<selenium +  python自动化测试>一书. 在与测试用例文件夹同一目录下新建一个文件夹package,用来放置封装方法的模块文件 我们将webdriver二次封装的文件命名为location.py from selenium import webdriver from test_case.pub

python+selenium十:selenium的二次封装

from selenium import webdriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.select import Selectfrom selenium.webdriver.common.action_chains im

k8s python api二次封装 例子

k8s python api二次封装 pip install pprint kubernetes import urllib3 from pprint import pprint from kubernetes import client from os import path import yaml class K8sApi(object): def __init__(self): # self.config = config.kube_config.load_kube_config() ur

史上最强大的selenium webdriver的封装

放出这个类,用法见测试用例. 1.基于selenium的二次封装,整体代码非常短易于理解,带有两个自定义方法示例供参考,易于扩展. 2.支持无限实例化此类,仍然保持使用同一个浏览器窗口. 3.支持使用自定义的方法名字,同时全所未有的支持了直接性的使用所有此类中没有定义的方法,但在官方类中有的api方法,比如直接支持DriverWrapper().execute_script(script, *args)这种写法. 4.其余想自定义名称的方法可以在这个类下面接着写或者继承这个类再添加其他更多方法

QuantLib 金融计算——自己动手封装 Python 接口(1)

目录 QuantLib 金融计算--自己动手封装 Python 接口(1) 概述 QuantLib 如何封装 Python 接口? 自己封装 Python 接口 封装 Array 和 Matrix 类 QuantLibEx 和官方包混合使用 附录:接口文件.setup.py 和 __init__.py QuantLib 金融计算--自己动手封装 Python 接口(1) 概述 QuantLib 已经开始在 PyPi 上发布封装好的 Python 接口,安装和使用非常方便,与普通的包别无二致.并且

LInux升级Python版本2.7.11所遇问题汇总

首先请原谅我使用校园网络,基本上打不开谷歌,网络搜取得帮助均来自度娘. 对于我这个linux新手 IT 新手来说,自己升级点东西好担心,万一出错,可能都要重来.... 参照度娘内容和自己摸索,今天晚上的升级以成功结束 哈哈哈 一.我需要把升级Linux里Python版本为2.7.11,度娘一艘,都是各种直接弄好的下载链接,发现了各种复制来复制去的内容,找来找去没找到2.7.11,所以转到了官网www.python.org 首页就可以看到download里最新的2.7.11,点进去,需要的就是最上

加密狗复制备份 克隆 破解 OEM信息 二次封装 行业软件破解 批发零售

加密狗复制备份 加密狗模拟   加密狗破解  定制写狗程序 算法注册机 OEM信息 二次封装 汉化  行业软件破解   酒店客房管理  餐饮娱乐 美容美发  会员管理  口腔诊所 口腔医院管理 商超POS 服装鞋帽 家具生产数控 家具设计拆单 排料优化 家居设计销售 药店管理 汽配汽修汽贸4S店管理 财务进销存 OA办公 企业积分制管理 电脑行业管理系统 客户管理...等各行业管理软件批发零售 合作联系QQ:309889372 部分产品列表展示 部分产品分类展示: 服装设计类行业: 主要针对服装

Android 应用程序集成FaceBook 登录及二次封装

1.首先在Facebook 开发者平台注册一个账号 https://developers.facebook.com/ 开发者后台  https://developers.facebook.com/apps 2.创建账号并且获得 APP ID 图一 图二 图三 图四 图五 3.获取app签名的Key Hashes 值(两种方式) 3.1方法1: 1 package com.pegasus.map.presentation.utils; 2 import android.content.Contex

对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)

首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览器,沿用原来的FLASH运行时,兼容IE6+,iOS 6+, android 4+.两套运行时,同样的调用方式,可供