1、python框架selenium

news2024/11/18 0:25:11

分层的自动化测试

什么样的产品适合做自动化测试?

功能成熟(需求变动较小)
产品更新维护周期长
项目进度不太大
比较频繁的回归测试
软件开发比较规范,具有可测试性
可以脚本具有可复用性

selenium 技术:

   元素定位的几种方法
   WebDriver  API ,selenium  IDE,selenium grid
python 技术:
   函数、类、方法;读写文件,unitest单元测试框架,HTMLTestRunner.py,发邮件模块,多线程技术等。

selenium 的特点:

开源,免费
多浏览器支持:firefox、chrome、IE
多平台支持:linux 、windows、MAC
多语言支持:java、python、ruby、php、C#、
对web页面有良好的支持
简单(API 简单)、灵活(用开发语言驱动)
支持分布式测试用例执行

 

selenium 2.0 = selenium 1.0 + WebDriver

环境搭建

简易安装:
第一步、安装Python


第二步、安装selenium
在cmd里面输入命令: pip install -U selenium


第三步、Selenium 与 浏览器驱动 - Firefox 驱动下载 下载火狐驱动

 

或者Releases · mozilla/geckodriver · GitHub

从https://npm.taobao.org/mirrors/geckodriver下载chromedriver驱动,

或者CNPM Binaries Mirror

或者http://chromedriver.storage.googleapis.com/index.html

官网下载:ChromeDriver - WebDriver for Chrome

放入c:\python27目录下即可,即使python目录下

第四步、安装firefox浏览器

安装chrome浏览器,这里需要注意浏览器版本和驱动的版本需要对应
否则启动浏览器会报错;
浏览器版本与驱动对应可以参考以下图片:

 案例1,百度搜索

百度搜索:
# coding = utf-8
from selenium import webdriver
browser = webdriver.Firefox()
browser.get("http://www.baidu.com")
browser.find_element_by_id("kw1").send_keys("selenium")
browser.find_element_by_id("su1").click()
browser.quit()

元素的定位

WebDriver 提供的八种定位方法:
find_element_by_id()
find_element_by_name()
find_element_by_class_name()
find_element_by_tag_name()
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_xpath()
find_element_by_css_selector()

id\name\class name\tag name :
百度搜索框前端代码(通过firebug查看)
<input  id="kw1" class="s_ipt" type="text" maxlength="100" name="wd" autocomplete="off">
find_element_by_id(‘kw1’)
find_element_by_name(‘wd’)
find_element_by_class_name(‘s_ipt’)
find_element_by_tag_name(‘input’)
注:页面上的元素tag name 相同的几率很高


link\partial link :
百度首页文字链接:
<a href="http://news.baidu.com" name="tj_news">新 闻</a>
<a href="http://tieba.baidu.com" name="tj_tieba">贴 吧</a>
<a href="http://zhidao.baidu.com" name="tj_zhidao">知 道</a>
find_element_by_link_text(u‘新 闻’)
find_element_by_partial_link_text(‘新’)
find_element_by_link_text(u‘贴 吧’)
...
注:中文字符串加u 是将中文转换成unicode,防止编码问题。

path:

 


find_element_by_xpath(‘//*[@id='kw1']’)
find_element_by_xpath(‘//input[@id='kw1']’)
find_element_by_xpath(‘//input[@name='wd']’)
find_element_by_xpath(‘//input[@class='s_ipt']’)
find_element_by_xpath(‘//span[@class='bg s_iptwr']/input’)
find_element_by_xpath(‘//form[@id='form1']/span/input’)
....
find_element_by_xpath(‘/html/body/div/div[4]/div[2]/div/form/span/input’)


CSS 常见语法:

 CSS :

 

定位</from>
find_element_by_css_selector(‘from’)
定位<div class="subdiv">
find_element_by_css_selector(‘.subdiv’)
find_element_by_css_selector(‘from+div’)
定位<ul id="recordlist">
find_element_by_css_selector(‘#recordlist’)
find_element_by_css_selector(‘ul#recordlist’)
find_element_by_css_selector(‘div>ul’)
定位<p>Heading</p>
find_element_by_css_selector(‘div>ul’)
find_element_by_css_selector(‘div.subdiv > ul > p’)

WebDriver API

浏览器最大化:
maximize_window()

设置浏览器宽、高:
set_window_size(480, 800)

控制浏览器后退,前进:
back()
forward()

WebElement接口常用方法:

clear         清除元素的内容
send_keys     在元素上模拟按键输入
click         单击元素
submit         提交表单
size      返回元素的尺寸
text      获取元素的文本
get_attribute(name)    获得属性值
is_displayed()      设置该元素是否用户可见

 ActionChains 类鼠标操作的常用方法:

  context_click()  右击
  double_click()   双击
  drag_and_drop()  拖动
  move_to_element()  鼠标悬停在一个元素上
  click_and_hold()   按下鼠标左键在一个元素上


context_click()  右击

#引入ActionChains类
from selenium.webdriver.common.action_chains import ActionChains
....
#定位到要右击的元素
right =driver.find_element_by_xpath("xx")
#对定位到的元素执行鼠标右键操作
ActionChains(driver).context_click(right).perform()
....

drag_and_drop()  拖动
#引入ActionChains类
from selenium.webdriver.common.action_chains import ActionChains
...
#定位元素的原位置
element = driver.find_element_by_name("xxx")
#定位元素要移动到的目标位置
target =  driver.find_element_by_name("xxx")
#执行元素的移动操作
ActionChains(driver).drag_and_drop(element,target).perform()

move_to_element()   鼠标悬停
#引入ActionChains类
from selenium.webdriver.common.action_chains import ActionChains
...
#定位元素的原位置
element = driver.find_element_by_name("xxx")
#定位元素要移动到的目标位置
target =  driver.find_element_by_name("xxx")
#执行元素的移动操作
ActionChains(driver).drag_and_drop(element,target).perform()

 Keys 类键盘操作的常用方法:

send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
send_keys(Keys.SPACE)  空格键(Space)
send_keys(Keys.TAB)  制表键(Tab)
send_keys(Keys.ESCAPE)  回退键(Esc)
send_keys(Keys.ENTER) 回车键(Enter)
send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)
send_keys(Keys.CONTROL,'c') 复制(Ctrl+C)
send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X)
send_keys(Keys.CONTROL,'v') 粘贴(Ctrl+V)

 ActionChains 类鼠标操作的常用方法:

 move_to_element()   鼠标悬停
...
#输入框输入内容
driver.find_element_by_id("kw1").send_keys("seleniumm")
time.sleep(3)
#删除多输入的一个m
driver.find_element_by_id("kw1").send_keys(Keys.BACK_SPACE)
time.sleep(3)
...

 打印信息(断言的信息):

title
返回当前页面的标题
current_url
获取当前加载页面的URL
text
获取元素的文本信息


打印信息(126邮箱):

#获得前面title,打印
title = driver.title
print title
#获得前面URL,打印
now_url = driver.current_url
print now_url
#获得登录成功的用户,打印
now_user=driver.find_element_by_id("spnUid").text
print now_user

 脚本中的等待时间:

sleep():
     python提供设置固定休眠时间的方法。
implicitly_wait():
     是webdirver 提供的一个超时等待。
WebDriverWait():
     同样也是webdirver 提供的方法。

 webdriver提供定位一组对象的方法:

find_elements_by_id()
find_elements_by_name()
find_elements_by_class_name()
find_elements_by_tag_name()
find_elements_by_link_text()
find_elements_by_partial_link_text()
find_elements_by_xpath()
find_elements_by_css_selector()

定位一组对象,例一:
……
# 选择页面上所有的tag name 为input的元素
inputs = driver.find_elements_by_tag_name('input')

#然后从中过滤出tpye为checkbox的元素,单击勾选
for input in inputs:
    if input.get_attribute('type') == 'checkbox':
        input.click()
……

定位一组对象,例二:
……
# 选择所有的type为checkbox的元素并单击勾选
checkboxes = driver.find_elements_by_css_selector('input[type=checkbox]')
for checkbox in checkboxes:
    checkbox.click()
……

层级定位:
……
#点击Link1链接(弹出下拉列表)
driver.find_element_by_link_text('Link1').click()

#在父亲元件下找到link为Action的子元素
menu = driver.find_element_by_id('dropdown1').find_element_by_link_text('Another action')

#鼠标移动到子元素上
ActionChains(driver).move_to_element(menu).perform()
……

frame表单嵌套的定位:
switch_to_frame  方法
……
#先找到到ifrome1(id = f1)
driver.switch_to_frame("f1")
#再找到其下面的ifrome2(id =f2)
driver.switch_to_frame("f2")
#下面就可以正常的操作元素了
driver.find_element_by_id("kw1").send_keys("selenium")
……

div弹窗的处理:
……
#点击登录链接
driver.find_element_by_name("tj_login").click()

#通过二次定位找到用户名输入框
div=driver.find_element_by_class_name("tang-content").find_element_by_name("userName")
div.send_keys("username")
……

多窗口的处理:
current_window_handle  
获得当前窗口句柄
window_handles
返回的所有窗口的句柄到当前会话
switch_to_window()
      用于处理多窗口之前切换

多窗口的处理:

#获得当前窗口
nowhandle=driver.current_window_handle
#打开注册新窗口
driver.find_element_by_name("tj_reg").click()
#获得所有窗口
allhandles=driver.window_handles
#循环判断窗口是否为当前窗口
for handle in allhandles:
    if handle != nowhandle:
        driver.switch_to_window(handle)
        print 'now register window!'
        #切换到邮箱注册标签
        driver.find_element_by_id("mailRegTab").click()
        driver.close()
        
driver.switch_to_window(nowhandle)#回到原先的窗口

alert/confirm/prompt处理:

switch_to_alert()
    用于获取网页上的警告信息。
text            
     返回 alert/confirm/prompt 中的文字信息。
accept        
     点击确认按钮。
dismiss        
     点击取消按钮,如果有的话。
send_keys    
    输入值,这个alert\confirm没有对话框就不能用了,不然会报错。

下拉框处理:
二次定位:
driver.find_element_by_xx('xx').find_element_by_xx('xx').click()
……
#先定位到下拉框
m=driver.find_element_by_id("ShippingMethod")
#再点击下拉框下的选项
m.find_element_by_xpath("//option[@value='10.69']").click()
……

文件上传:
driver.find_element_by_xx('xx').send_keys('d:/abc.txt')
……
#定位上传按钮,添加本地文件
driver.find_element_by_name("file").send_keys('D:\\selenium_use_case\upload_file.txt')
……

文件下载:

确定Content-Type : 下载文件的类型

方法一:
curl -I URL | grep "Content-Type"

方法二:
import requests
print
requests.head(’http://www.python.org’).headers[’content-type’]

文件下载:
fp = webdriver.FirefoxProfile()
fp.set_preference("browser.download.folderList",2)
fp.set_preference("browser.download.manager.showWhenStarting",False)
fp.set_preference("browser.download.dir", os.getcwd())
fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream")
browser = webdriver.Firefox(firefox_profile=fp)
browser.get("http://pypi.python.org/pypi/selenium")
browser.find_element_by_partial_link_text("selenium-2").click()

调用javaScript:
execute_script()  调用js方法
#隐藏文字信息
driver.execute_script('$("#tooltip").fadeOut();')
#隐藏按钮:
button = driver.find_element_by_class_name('btn')
driver.execute_script('$(arguments[0]).fadeOut()',button)

滚动条处理
#将页面滚动条拖到底部
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)

#将滚动条移动到页面的顶部
js_="var q=document.documentElement.scrollTop=0"
driver.execute_script(js_)

cookie处理:
get_cookies()  
     获得所有cookie信息
get_cookie(name)  
     返回特定name 有cookie信息
add_cookie(cookie_dict)
     添加cookie,必须有name 和value 值
delete_cookie(name)
     删除特定(部分)的cookie信息
delete_all_cookies()
     删除所有cookie信息

验证码的解决方法:
去掉验证码
设置万能码
验证码识别技术
记录cookie

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/192270.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[基础语法] python语法之列表、判断、循环例子

文章目录购物车案例已发布&#xff1a;整体框架打印商品列表将商品加入购物车打印购物车、计算总金额完整代码另外说明购物车案例 已发布&#xff1a; python判断语句python循环语句python之列表list购物车案例后续暂时不更新&#xff0c;有想要的部分&#xff0c;可以后台留…

11、Servlet——综合案例(Servlet+JDBC):管理员登录

目录 1、在MySQL中新建一个servletdatabase数据库&#xff0c;创建表admin 2、在web中创建登录页面login.html 3、在web中创建CSS文件夹&#xff0c;在CSS文件夹中创建login.css 4、在web下新建注册页面register.html 5、在CSS文件夹中新建register.css 6、在CSS文件夹下新…

文件包含漏洞

数据来源 本文仅用于信息安全的学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若观众因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与本人无关。 01 文件包含漏洞概述 简单例子 PHP中的文件包含函数 02 文件包含漏洞类型及利用 本地文…

基于MATLAB的车牌识别系统设计

基于MATLAB的车牌识别系统设计 摘要 随着公路逐渐普及&#xff0c;我国的公路交通事业发展迅速&#xff0c;所以人工管理方式已经不能满着实际的需要&#xff0c;微电子、通信和计算机技术在交通领域的应用极大地提高了交通管理效率。汽车牌照的自动识别技术已经得到了广泛应…

弱网测试利器-Charles工具实战

一&#xff1a;弱网测试要点 二&#xff1a;利用抓包工具charles进行弱网设置&#xff0c;适用PC端和移动端&#xff08;IOS&#xff0f;Android&#xff09; 1、以charles 4.5.6版本为例&#xff0c;打开Proxy->Throttle Settings 2、打开Throttle Settings&#xff0c;界…

实战详细讲解Qt插件plugin的编写与用法

目录 1.Qt的插件是什么&#xff1f;优点是什么&#xff1f; 2.实战项目需求 3. 程序设计分析 4.Qt插件的编写 Q_DECLARE_INTERFACE&#xff08;类名&#xff0c;标识符&#xff09; Q_INTERFACES 5.插件的调用 总结感言&#xff1a; 1.Qt的插件是什么&#xff1f;优点是…

let/const相关的内容(一)

1.let/const的基本使用 在ES5中我们声明变量都是使用的var关键字(variable的缩写)&#xff0c;从ES6开始新增了两个关键字可以声明变量&#xff1a;let、const。 let和const在其他编程语言中都是有的&#xff0c;所以并不是新鲜的关键字&#xff0c;但是他们确实给JS带来了不一…

动态规划设计LeetCode 300. 最长递增子序列 354. 俄罗斯套娃信封问题

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 300. 最长递增子序列 354. 俄罗斯套娃信封问题&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434…

【openGauss】把应用开发中的设置客户端字符编码往细了说

前言 早前写过两篇有关Oracle字符集的文章 【ORACLE】谈一谈Oracle数据库使用的字符集,不仅仅是乱码 【ORACLE】谈一谈NVARCHAR2、NCHAR、NCLOB等数据类型和国家字符集 基本说明了 ”数据字符编码“、”客户端字符编码“、”数据库字符编码“三者的关系&#xff0c;这些关系&a…

磨金石教育摄影技能干货分享|年味就是幸福圆满的味道

时光荏苒&#xff0c;时代变迁。以前是古街古巷&#xff0c;现在是高楼大厦。以前的老街&#xff0c;灯笼满街&#xff0c;烟火气十足。现在的城市商业街中霓虹灯可以展示出各种新年的影像。无论时代如何变迁&#xff0c;无论时光走了多远&#xff0c;我们对春节的期待从未改变…

吴恩达机器学习(二)——机器学习之监督模型之回归模型之线性回归模型

y-hat一般指的就是预测值 线性回归模型实例 构建模型 我们有一个房子的大小size&#xff0c;得到房屋价格&#xff08;price&#xff09;&#xff0c;通过这两个常数就可计算一个输入和输出的函数关系。 f w&#xff0c;b(x(i)) wx(i) b i指的是第几个训练数据 评估模型——…

【教程】browsermob-proxy 基于Java的代理服务 配合selenium使用

【教程】browsermob-proxy 基于Java的代理服务 配合selenium使用 配置依赖 <!-- 代理 配合 selenium进行抓包修改等 --><dependency><groupId>net.lightbody.bmp</groupId><artifactId>browsermob-core</artifactId><version>2.1.5&…

H3C Switch S1848G端口限速

需求&#xff1a;在交换机层面对接入用户的网络流量限速1.交换机信息2.主机限速前2.1本机IP和MAC信息依次打开控制面板\所有控制面板项\网络连接2.2限速前测速使用浏览器打开https://10000.gd.cn/测速3.主机限速后3.1查看主机所在交换机接口点击“网络”-“MAC地址”&#xff0…

【微信小程序】给你的页面加上一个填写进度表

前言在搭建一些与申请相关的微信小程序的时候&#xff0c;用户会遇到需要填写很多表单的情况&#xff0c;面对未知的表单数量&#xff0c;用户往往就会放弃填写申请表格。在此基础上作为开发者的我们常常会收到这样的一个任务——给申请页面加上一个填写进度表。这样不仅可以优…

274. H 指数

274. H 指数一、题目描述二、题目分析三、解题思路3.1 更换H指数定义3.2 二分法枚举H指数一、题目描述 二、题目分析 这道题比较绕&#xff0c;理解题目意思&#xff0c;根据题目的说法&#xff0c;所谓的H指数就是&#xff1a;总共有 h 篇论文分别被引用了至少 h 次。且其余的…

二战阿里巴巴成功上岸,准备了小半年,要个28k应该也算不上很高吧~

先说下我基本情况&#xff0c;本科不是计算机专业&#xff0c;现在是学通信&#xff0c;然后做图像处理&#xff0c;可能面试官看我不是科班出身没有问太多计算机相关的问题&#xff0c;因为第一次找工作&#xff0c;阿里的游戏专场又是最早开始的&#xff0c;就投递了&#xf…

Spring Cloud Alibaba系列三:集成Gateway实现路由管理

文章目录Spring Cloud Alibaba系列三&#xff1a;集成Gateway实现路由管理前言1、改造父项目 pom 文件2、创建 gateway 子 module3、配置yml文件Spring Cloud Alibaba系列三&#xff1a;集成Gateway实现路由管理 spring cloud alibaba 版本对照 spring cloud alibaba 有严格的…

【MPP数据库】TiDB表分区探索与实践

方案背景——为什么要进行分区&#xff1f; 一是老板通Tidb集群每天涉及50张表、2亿多条数据回流&#xff0c;合理使用Hash可以把写入压力打散到不同的TiKV&#xff1b; 二是对于大集团数据做聚合&#xff0c;利用分区裁剪原理&#xff0c;查询时可以充当前置索引&#xff0c…

1月第4周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩平台)发布!

飞瓜轻数发布2023年1月23日-1月29日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B…

卫星地图——MAP(c++)

卫星地图 题目描述 一张矩形的卫星地图&#xff0c;有M行N列。行列中的0表示空地&#xff0c;1表示有建筑。有3种类型的建筑: L型: 仅在一行上占据连续的若干个格子&#xff0c;长度至少为2&#xff0c;至多为N C型&#xff1a;仅在一列上占据连续的若干个格子&#xff0c;…