selenium+python自动化测试
F12:
右键 选择复制 path
在selenium+python自动化测试(一)–环境搭建中,运行了一个测试脚本,脚本内容如下:
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
print(driver.title)
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
time.sleep(3)
driver.close()
- 运行脚本的第一步是打开浏览器,使用webdriver.Chrome()打开谷歌浏览器,如果要指定其他浏览器,比如要使用Firefox或者IE浏览器,更换浏览器名称就可以了
driver = webdriver.Chrome() //打开Chrome浏览器
driver = webdriver.Firefox() //打开Firefox浏览器
driver = webdriver.Ie() //打开IE浏览器
- 第二步操作是打开页面,使用driver.get(url)方法来打开网页链接,例如脚本中打开百度首页
driver.get("http://www.baidu.com")
- 接下来是print(driver.title),使用driver.title获取当前页面的title,title就是在浏览器tab上显示的内容,例如百度首页的标题是“百度一下,你就知道”
浏览器前进后退
在当前页面打开一个新的链接后,如果想回退到前一个页面,使用如下driver.back(),相当于点击了浏览器的后退按钮
和back操作对应的是浏览器前进操作driver.forward(),相当于点击了浏览器的前进按钮
driver.back() //回到上一个页面
driver.forward() //切换到下一个页面
- 最大化浏览器窗口
浏览器运行后,如果页面没有最大化,可以调用driver.maximize_window()将浏览器最大化,相当于点击了页面右上角的最大化按钮
也可以自定义浏览器的尺寸
driver.maximize_window() //浏览器窗口最大化
driver.set_window_size(800, 720) //设置窗口大小为800*720
- 屏幕截图
打开页面以后,可以对页面进行截屏,在遇到异常的时候,根据截图可以快速定位问题的原因所在
浏览器截屏操作,参数是截屏的图片保存路径:
driver.get_screenshot_as_file("D:/data/test.png")
- 页面刷新
有时页面过期后,网页上显示的信息可能不是最新的,需要对页面进行刷新,使用refresh()方法刷新页面,相当于点击浏览器的刷新按钮
driver.refresh() //重新加载页面
- 退出浏览器
在测试脚本运行完后,一般会在最后关闭浏览器,有两种方法关闭浏览器,close()方法用于关闭当前页面,quit()方法关闭所有和当前测试有关的浏览器窗口
driver.close() //关闭当前页面
driver.quit() //关闭所有由当前测试脚本打开的页面
一份简单的测试 demo
关于 360 haosou.com 的测试 :

1 #coding=utf-8
2 from selenium import webdriver
3 import os
4 import time
5 # set little time stop and big time stop for viewing changes
6 little_time_stop = 1
7 big_time_stop = 2
8 # 默认广告条数
9 ads_num_require = 8
10 # 请求连接
11 req_url = "http://www.haosou.com/s?ie=utf-8&shb=1&src=360sou_newhome&q=%E9%B2%9C%E8%8A%B1"
12 # 打开浏览器
13
14 browser = webdriver.Chrome()
15 # 开始请求
16 17 browser.get(req_url)
18 # 获取所有的广告
19
20 all_ads_li = browser.find_elements_by_css_selector('#e_idea_pp li')
21 # 当前广告条数
22 ads_num_current = len(all_ads_li)
23 print "Has been got %d ads" %(ads_num_current)
24 # 如果广告条数与默认不符
25 if ads_num_current < ads_num_require:
26 print "The number of ads is not enough ( current : %d require: %d)" %(ads_num_current,ads_num_require)
27 # exit()
28 # 获取顶部连接
29 i = 0
30 for ads_li in all_ads_li:
31 time.sleep(big_time_stop)
32 i = i+1
33 print "ads %d :" %i
34 try:
35 main = ads_li.find_element_by_css_selector('h3 a')
36 except:
37 print "\tError: ads %d cann't find" %(i)
38 else:
39 print "\tReady: visit ads %d" %(i)
40 main.click()
41 print "\tSucess: visit ads %d" %(i)
42 time.sleep(little_time_stop)
43 try:
44 img_link = ads_li.find_element_by_class_name('e_biyi_img')
45 except:
46 print "\tError : no img in ads %d " %(i)
47 else:
48 print "\tReady : visit img_link %d" %(i)
49 img_link.click()
50 print "\tSuccess : visit img_link %d" %(i)
51 time.sleep(little_time_stop)
52 try:
53 child_div = ads_li.find_element_by_class_name('e_biyi_childLink');
54 except:
55 print "\tError : no child link in ads %d" %(i)
56 else:
57 try:
58 child_links = child_div.find_elements_by_css_selector('a')
59 except:
60 print "\tError : find child_links error"
61 else:
62 num_links = len(child_links)
63 print "\tSuccess : there are %d child_links" %(num_links)
64 j = 0
65 for child_a in child_links:
66 j = j + 1
67 print "\t\tReady : visit child link %d in ads %d" %(j, i)
68 child_a.click()
69 print "\t\tSuccess : visit child link %d in ads %d" %(j, i)
70 time.sleep(little_time_stop)
71 print "End and thanks for your using!"
72 # 下面代码选择取消注释
73 # 延时
74 # time.sleep(5)
75 # 关闭当前窗口
76 # browser.close()
77 # 关闭所有已经打开的窗口
78 # browser.quit()

定位操作
以下是所有定位操作的 API :
返回一个匹配元素, 即一个 WebElement 元素
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()
返回一个列表, 包含所有匹配的元素, 即一个 WebElement 列表
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()
使用的时候需注意下面几点 :
- python selenium 提供了两种对象 :
WebDriver和WebElement
这两种对象都可以使用这些 API - 这些 API 一旦执行失败(即查找不到), 就会抛出异常
因此必须使用try: .. except: ...机制避免错误的行为影响程序继续进行 WebDriver调用以上 API 进行全局定位WebElement调用以上 API 可以进行层级定位, 即查找当前元素的子元素
WebDriver 的使用
开始的时候必须要有初始化一个 WebDriver 实例, 即下面的 browser 用来对浏览器进行控制以及页面的访问
# 请求连接req_url = "http://www.haosou.com/s?ie=utf-8&shb=1&src=360sou_newhome&q=%E9%B2%9C%E8%8A%B1"# 打开浏览器browser = webdriver.Chrome()# 开始请求browser.get(req_url)
接着, 就可以使用异常 API 进行当前页面的全局查找, 比如 :
# 获取所有的广告all_ads_li = browser.find_elements_by_css_selector('#e_idea_pp li')
WebElement 的使用
使用
browser.find_element_by_xx()得到的是一个WebElement实例
使用获得的实例调用上面的 API 即可进行层级查找使用
browser.find_elements_by_xx()得到的是一个元素是WebElement实例的 list
通过对 list 的遍历, 即可对各个实例进行相应的操作
WebDriver 的一些常用操作
browser.curren_url: 获取当前加载页面的 URLbrowser.close(): 关闭当前窗口, 如果当前窗口是最后一个窗口, 浏览器将关闭browser.quit(): 关闭所有窗口并停止 ChromeDriver 的执行browser.add_cookie(cookie_dict): 为当前会话添加 cookiebrowser.get_cookie(name): 得到执行 cookiebrowser.get_cookies(): 得到所有的 cookiedriver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’}) driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’, ‘path’ : ‘/’}) driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’, ‘path’ : ‘/’, ‘secure’:True})
browser.delete_all_cookies(): 删除当前会话的所有cookiebrowser.delete_cookie(name): 删除指定 cookiebrowser.back(): 相当于浏览器的后退历史记录browser.forward(): 相当于浏览器的前进历史记录browser.execute_script(script, *args): 同步执行 js 脚本browser.execute_async_script(script, *args): 异步执行 js 脚本browser.get(url): 在当前窗口加载 urlbrowser.refresh(): 刷新当前页面browser.current_window_handle: 当前窗口的 handle, 相当于一个指针一样的东西, 用来指向当前窗口browser.window_handles: 当前浏览器中的已经打开的所有窗口, 是一个 listbrowser.switch_to_window(window_handle): 切换 window_handle 指向的窗口browser.title: 当前页面的 titlebrowser.name: 当前浏览器的名字
WebElement 的一些常用操作
webEle.clear(): 清楚元素的内容, 假如这个元素是一个文本元素webEle.click(): 点击当前元素webEle,is_displayed(): 当前元素是否可见webEle.is_enabled(): 当前元素是否禁止, 比如经常会禁用一些元素的点击webEle.is_selected(): 当前元素是否选中, 文本输入框的内容webEle.send_keys(*value): 向当前元素模拟键盘事件webEle.submit(): 提交表单webEle.tag_name: 当前元素的标签名webEle.text: 当前元素的内容webEle.get_attribute(name): 获取当前元素执行属性的值
selenium+python自动化测试的更多相关文章
- selenium + python 自动化测试环境搭建
selenium + python 自动化测试 —— 环境搭建 关于 selenium Selenium 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操 ...
- selenium + python自动化测试unittest框架学习(五)webdriver的二次封装
因为webdriver的api方法很长,再加上大多数的定位方式是以xpath方式定位,更加让代码看起来超级长,为了使整体的代码看起来整洁,对webdriver进行封装,学习资料来源于虫师的<se ...
- selenium + python自动化测试unittest框架学习(二)
1.unittest单元测试框架文件结构 unittest是python单元测试框架之一,unittest测试框架的主要文件结构: File >report >all_case.py &g ...
- selenium+python自动化测试系列(一):登录
最近接手商城的项目,针对后台测试,功能比较简单,但是流程比较繁多,涉及到前后台的交叉测试.在对整个项目进行第一轮测试完成之后,考虑以后回归测试任务比较重,为了减轻回归测试的工作量,所以考虑后台 ...
- selenium + python自动化测试环境搭建
selenium的在python平台的搭建: 搭建平台windows 准备工具如下: --------------------------------------------------------- ...
- selenium + python自动化测试环境搭建--亲测
环境准备: 1.下载所学安装包: setuptools https://pypi.python.org/packages/2.7/s/setuptools/ selenium https://pypi ...
- selenium + python自动化测试unittest框架学习(一)selenium原理及应用
unittest框架的学习得益于虫师的<selenium+python自动化实践>这一书,该书讲得很详细,大家可以去看下,我也只学到一点点用于工作中,闲暇时记录下自己所学才能更加印象深刻. ...
- Selenium+Python自动化测试实战(2)元素定位
1.Selenium2 的原理 第一篇分享简单介绍了基于Python开发的Selenium2的环境配置,这篇主要讲一下基本用法.首先讲一下Selenium2的基本原理.基本上知道了这个东西是怎么回事, ...
- Selenium+Python自动化测试环境搭建和搭建过程遇到的问题解决
环境搭建: 第一步:安装Python 网址:https://www.python.org/ 按照如图提示安装,并且配置环境变量(安装时候选中pip会自动安装Python的包管理工具 pip,推荐选择 ...
随机推荐
- Java进阶(二十)解疑答惑之何时字符串才算真正为空?
解疑答惑之何时字符串才算真正为空? 在一次编码过程中,有一个现象一直困扰着自己,经过后台的不断调试,才发现原来有时候字符串的空非空.测试代码如下: // medname可为药品名称或药品ID Stri ...
- Java线程专栏文章汇总
转载自 http://blog.csdn.net/ghsau/article/details/17609747 JDK5.0之前传统线程 Java线程(一):线程安全与不安全 J ...
- CMake添加-D_DEBUG宏
Linux下Debug版不会自动添加 _DEBUG宏,只有NDEBUG宏可用. cmake ../src _DCMAKE_BUILD_TYPE=Debug -D_DEBUG 会报错: -D_DEBUG ...
- Netmask, 子网与 CIDR (Classless Interdomain Routing)
Netmask, 子网与 CIDR (Classless Interdomain Routing) 我们前面谈到 IP 是有等级的,而设定在一般计算机系统上面的则是 Class A, B, C.现在我 ...
- C语言可变参实现参数累加返回
C语言可变参的作用真的是非常大,自从发表了可变参如何实现printf,fprintf,sprintf的文章以来,便有不少博友私信问我实现的机制,我也解释了相关的知识点.今天,我们借着这个机会,再来举一 ...
- MacRuby 0.3发布,支持Interface Builder,和创建GUI用的HotCocoa
作者 Werner Schuster ,译者 贾晓楠 发布于 2008年9月24日 | 分享到: 微博 微信 QQ空间 LinkedIn Facebook 邮件分享 稍后阅读 我的阅读清单 现在,Ma ...
- MOOS学习笔记2——HelloWorld回调
MOOS学习笔记2--HelloWorld回调 例程 #include "MOOS/libMOOS/Comms/MOOSAsyncCommClient.h" bool OnConn ...
- java 深入理解内部类以及之间的调用关系
什么是内部类 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用public和 ...
- linux上安装redis的踩坑过程
redis用处很广泛,我不再啰嗦了,我按照网上教程想在linux上安装下,开始了踩坑过程,网上买了一个linux centos7.3,滴滴云的,巨坑无比啊,不建议大家用这家的! redis 为4.0, ...
- JavaScript中对象数组,如何给对象添加一个新属性
var a =[{name: 'Tom',age:20},{name: 'Tom2',age:22}] 现在给a数组中的第一个对象添加性别属性 a[0]['gender']='women' a[0][ ...