基于python的Selenium使用小结
之前介绍过基于Unittest和TestNG自动化测试框架,然而基于Web端的测试的基础框架是需要Selenium做主要支撑的,这里边给大家介绍下Web测试核心之基于Python的Selenium
一、简单介绍
Selenium 是用于测试 Web 应用程序用户界面 (UI) 的常用框架。它是一款用于运行端到端功能测试的超强工具。您可以使用多个编程语言编写测试,并且 Selenium 能够在一个或多个浏览器中执行这些测试。
二、环境安装
1. 安装python,这个。。。忽略,建议python2.7。
2. 安装基于python的selenium依赖包,命令:pip install selenium==2.53.6,你懂的。
3. 安装浏览器驱动包,推荐使用chrome浏览器的chromedriver.exe,对应chrome版本一定要对哦,不然运行不起来的,安装在哪?想放哪放哪,不过一般是放在python的根目录下。下载地址:http://chromedriver.storage.googleapis.com/index.html
4. 安装PyCharm 2.7左右版本,这个无脑安装~然后可自定义界面UI及编码风格,这个。。。忽略
三、牛刀小试
1. 控制浏览器
#coding=utf-8
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.maximize_window() #将浏览器最大化显示
driver.set_window_size(480, 800) #设置浏览器宽480、高800显示" driver.back() #后退
driver.forward() #前进 driver.close() #关闭chrome
driver.quit() # 退出chrome
2. 对象的定位
1.通过id定位:find_element_by_id()
2.通过name定位:find_element_by_name()
3.通过class定位:find_element_by_class_name()
4.通过tag定位:find_element_by_tag_name()
5.通过link定位:find_element_by_link_text()
6.通过partial_link定位:find_element_by_partial_link_text()
7.通过xpath定位:find_element_by_xpath("//*[@属性='属性值'] #定位页面下的所有包含特定属性值的元素,Contains你懂的")
8.通过css定位:find_element_by_css_selector("例子:p > div[属性 = "属性值"] > div:contains("内容") + img > ul:nth(1)")
不得不说一点的是,css定位应该是除id及name的首选了,为啥呢?玩过js你就知道了,一般开发都是通过其方式获取事件源,你懂的。
以上几种定位是常规操作,应该就基本够用了,但是有的时候就是会出现一些诡异的定位失效或者定位到了点击失效的问题,这个时候如果用js进行直接执行该事件,接下来介绍下非常规操作:
- id定位:document.getElementById()
- name定位:document.getElementsByName()
- tag定位:document.getElementsByTagName()
- class定位:document.getElementsByClassName()
- css定位:document.querySelectorAll()
search_js = "document.getElementsByName('wd')[0].value='selenium';"# 通过name定位,然后赋值“selenium”
search_js2 = "document.querySelectorAll('.s_ipt')[0].value='selenium';"# 通过css定位,然后赋值“selenium”
button_js = "document.getElementById('su').click();"# 通过id定位,然后执行单击操作
button_js2 = "document.getElementsByClassName('s_btn')[0].click()"# 通过className定位,然后执行单击操作
driver.execute_script(search_js2)#执行,execute_script(script, *args)
以上几种定位是可以再度升级,可以利用jQuery定位一波,这里可参看之前总结的JQ选择器中的思维导图知识点(https://www.cnblogs.com/aoaoao/articles/9708860.html)来实现,这里基本类似于JS,便忽略
3. 操作测试对象
#coding=utf-8
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://passport.kuaibo.com/login/")
driver.find_element_by_id("user_name").clear() #清除输入框的默认内容
driver.find_element_by_id("user_name").send_keys("username")
driver.find_element_by_id("user_pwd").clear()
driver.find_element_by_id("user_pwd").send_keys("password") #输入输入框的内容为“password”
driver.find_element_by_id("dl_an_submit").click() #通过 submit() 来提交操作
driver.find_element_by_id("dl_an_submit").submit()
size=driver.find_element_by_id("kw").size #返回百度输入框的宽高
text=driver.find_element_by_id("cp").text #返回百度页面底部备案信息
#返回元素的属性值,可以是 id、name、type 或元素拥有的其它任意属性
attribute=driver.find_element_by_id("kw").get_attribute('type')
#返回元素的结果是否可见,返回结果为 True 或 False
result=driver.find_element_by_id("kw").is_displayed()
driver.quit() #退出
4. 鼠标键盘事件
from selenium import webdriver
#引入 Keys 类包
from selenium.webdriver.common.keys import Keys
#引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains
...
#鼠标事件
#定位到要操作的元素
right =driver.find_element_by_xpath("xx")
#对定位到的元素执行鼠标右键操作
ActionChains(driver).context_click(right).perform()
#对定位到的元素执行鼠标双击操作
ActionChains(driver).double_click(right).perform()
#对定位到的元素执行鼠标移动到上面的操作
ActionChains(driver).move_to_element(right).perform()
#对定位到的元素执行鼠标左键按下的操作
ActionChains(driver).click_and_hold(right).perform()
#定位元素的原位置
element = driver.find_element_by_name("xxx")
#定位元素要移动到的目标位置
target = driver.find_element_by_name("xxx")
#执行元素的移动操作
ActionChains(driver).drag_and_drop(element, target).perform() #键盘事件
#删除多输入的一个 值
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
#输入空格键+“教程”
driver.find_element_by_id("kw").send_keys(Keys.SPACE)
driver.find_element_by_id("kw").send_keys(u"教程")
#ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
#其余的键盘操作类似
5. 等待时间
#coding=utf-8
from selenium import webdriver
#导入 WebDriverWait 包
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
#导入 time 包
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#WebDriverWait()方法使用,显示等待,WebDriverWait(driver,超时时长,调用频率,忽略异常).until(可执行方法,超时返回的信息),这里可以调用EC来实现可执行方法
is_disappeared = WebDriverWait(driver, 30, 1, NoSuchElementException).until_not(lambda x: x.find_element_by_id(“kw”).is_displayed())
#until(method, message=’ ’),调用该方法提供的驱动程序作为一个参数,直到返回值不为 False
element.send_keys("selenium")
#添加智能等待,隐时等待
driver.implicitly_wait(30)
driver.find_element_by_id("su").click()
#添加固定休眠时间,强制等待
time.sleep(5)
driver.quit()
6. 组对象定位及层级定位,呃,忽略
7. 多窗口处理
#coding=utf-8
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com/")
#获得当前窗口
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()
time.sleep(5)
driver.close()
#回到原先的窗口
driver.switch_to_window(nowhandle)
driver.find_element_by_id("kw").send_keys(u"注册成功!")
time.sleep(3) #ifrome处理
#这里会自动识别id,name,如果没有则可以将元素通过选择器找到,然后输入该元素即可
driver.switch_to_frame("f1")
element = driver.find_element_by_id("kw")
driver.switch_to_frame(element)
driver.quit()
8. 提示窗口处理
#coding=utf-8
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com/")
#点击打开搜索设置
driver.find_element_by_name("tj_setting").click()
driver.find_element_by_id("SL_1").click()
#点击保存设置
driver.find_element_by_xpath("//div[@id='gxszButton']/input").click()
#获取网页上的警告信息
alert=driver.switch_to_alert()
#接收警告信息
alert.accept()
#取消对话框(如果有的话)
alert.dismiss()
#输入值(如果有的话)
alert.send_keys(“xxx”)
9. 控制浏览器滚动条,这个运用之前提示的jq语句即可实现
10. cookie处理,主要用途在于处理验证码问题
#coding=utf-8
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.youdao.com")
#向 cookie 的 name 和 value 添加会话信息。
driver.add_cookie({'name':'key-aaaaaaa', 'value':'value-bbbb'})
#遍历 cookies 中的 name 和 value 信息打印,当然还有上面添加的信息
for cookie in driver.get_cookies():
print "%s -> %s" % (cookie['name'], cookie['value'])
##### 下面可以通过两种方式删除 cookie #####
# 删除一个特定的 cookie
driver.delete_cookie("CookieName")
# 删除所有 cookie
driver.delete_all_cookies()
time.sleep(2)
driver.close()
四、小结
在熟悉了selenium常见的API基本操作后,这里便可以开展实际测试用例的设计了,一个良好的自动化测试用例起码符合一下五个条件:
1、一个脚本是一个完整的场景,从用户登陆操作到用户退出系统关闭浏览器。
2、一个脚本脚本只验证一个功能点,不要试图用户登陆系统后把所有的功能都进行验证再退出系统
3、尽量只做功能中正向逻辑的验证,不要考虑太多逆向逻辑的验证,逆向逻辑的情况很多(例如手 号输错有很多种情况),验证一方面比较复杂,需要编写大量的脚本,另一方面自动化脚本本身比较脆弱, 很多非正常的逻辑的验证能力不强。(我们尽量遵循用户正常使用原则编写脚本即可)
4、脚本之间不要产生关联性,也就是说编写的每一个脚本都是独立的,不能依赖或影响其他脚本。
5、如果对数据进行了修改,需要对数据进行还原。 6、在整个脚本中只对验证点进行验证,不要对整个脚本每一步都做验证。
最后配合unittest或者testNG单元测试框架,实现分层、数据驱动、断言、截图、日志等全方位功能,得心应手的开展自动化测试工作。
基于python的Selenium使用小结的更多相关文章
- 基于python的selenium自动化测试环境搭建
Windows下的环境搭建: 1.安装python2.7.152.cmd里敲pip install selenium3.安装firefox47.geckodriver11(并将geckodriver. ...
- 《Selenium自动化测试实战:基于Python》Selenium自动化测试框架入门
第1章 Selenium自动化测试框架入门 1.1 Selenium自动化测试框架概述 说到目前流行的自动化测试工具,相信只要做过软件测试相关工作,就一定听说过Selenium. 图1-1是某企业 ...
- 基于python的selenium自动化测试环境安装
1. Python2安装 官方网站:https://www.python.org/downloads/ (python3或新版本已经默认集成了pip包和path,安装的时候打勾就行,可以直接跳过下面第 ...
- 基于python的selenium常用操作方法(2)
9 多表单切换 在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位.这 ...
- 基于python的selenium常用操作方法(1)
1 selenium定位方法 Selenium提供了8种定位方式. · id · name · class name · tag ...
- 阿里大牛教你基于Python的 Selenium自动化测试示例解析
今天给大家讲解的是自动化测试示例的解析,如有不对的地方请多多指教. 自动化测试示例如下: from selenium import webdriver from selenium.webdriver. ...
- 基于python的selenium两种文件上传操作
方法一.input标签上传 如果是input标签,可以直接输入路径,那么可以直接调用send_keys输入路径,这里不做过多赘述,前文有相关操作方法. 方法二.非input标签上传 这种上传方 ...
- 基于Python的selenuim自动化测试尝试
工作这么多年了,终于狠下心好好开始学学自动化测试相关知识,揭开这层神秘的面纱. 困难重重,障碍很多,但好在每天都多少有点小收获. 很感谢一个QQ好友推荐的虫师,也非常感谢在这个契机读到了虫师编著的&l ...
- 一次完整的自动化登录测试-基于python+selenium进行cnblog的自动化登录测试
Web登录测试是很常见的测试!手动测试大家再熟悉不过了,那如何进行自动化登录测试呢!本文作者就用python+selenium结合unittest单元测试框架来进行一次简单但比较完整的cnblog自动 ...
随机推荐
- JQuery官方学习资料(译):类型
类型 JavaScript提供了多个内置数据类型.除了这些,这份文档还将介绍一些虚拟类型,例如选择器.伪类.事件等. String 在JavaScript中字符串是一个不可变的对象,它包含无. ...
- T-SQL基础(三)之子查询与表表达式
子查询 在嵌套查询中,最外面查询结果集返回给调用方,称为外部查询.嵌套在外部查询内的查询称为子查询,子查询的结果集供外部查询使用. 根据是否依赖外部查询,可将子查询分为自包含子查询和相关子查询.自包含 ...
- [android] 采用post的方式提交数据
GET:内部实现是组拼Url的方式,http协议规定最大长度4kb,ie浏览器限制1kb POST和GET的区别比较了一下,多了几条信息 Content-Type:application/x-www- ...
- 表单时间和定时器this的指向
1.针对表单的 form 表单 input 输入框 select 下拉列表 textarea 文本域 type 类型 radio 单选框 checkbox 多选框 password 密码框 but ...
- PATH环境变量
PATH是环境变量,要大写 那几个目录是你放置linux命令的目录,输入命令后系统会去PATH中寻找是否存在该命令 查看当前环境变量: echo $PATH 也可以用set命令看一下 设置: expo ...
- 8.异常_EJ
第57条: 只针对异常情况才使用异常 异常是为了在异常情况下使用而设计的,不要将它们用于普通的控制流,也不要编写迫使它们这么做的API. 第58条: 对可恢复的情况使用受检异常,对编程错误使用运行时异 ...
- js正则表达式之人民币匹配
人民币格式匹配 小写格式:¥ 符号 和 整数值 与小数3部分组成. (0)代码与运行结果 { // 匹配人民币 let [reg, info, rmb, result] = [ /^(¥)(-?[0- ...
- 1,JavaScript前世今生
JavaScript历史大概在1992年,一家称作Nombas的公司开始开发一种叫做C–(C-minus-minus,简称Cmm)的嵌入式脚本语言. Cmm背后的理念很简单:一个足够强大可以替代宏操作 ...
- JS中replace替换全部的正确应用
一般使用 var str = "test-test-test"; str = "test-test-test".replace("test" ...
- QoS技术总结
1.QoS主要功能是作为保证服务质量而存在,服务质量最明显的体现根据不同的优先级作出不同的转发行为.高优先级的报文不丢弃,低优先级的报文不能保证带宽. 2.当即将发生拥塞时,QoS的作用就体现出来了. ...