selenium_webdriver_(python)第三版 - GitHubliuxianhui/python GitHub Wiki
博客园—虫师 http://1 fnng.cnblogs.com selenium webdriver (python) (第三版) 声明: 本文档以收费方式出售,未经过作者本人允许,禁止一切非法的传播,禁止用于任何商 业用途。 博客园--虫师 [email protected] 博客园—虫师 http://2 fnng.cnblogs.com 前言 对于大多软件测试人员来讲缺乏编程经验(指项目开发经验,大学的C 语言算很基础 的编程知识)一直是难以逾越的鸿沟,并不是说测试比开发人员智商低,是国内的大多测试 岗位是功能测试为主,在工作时间中,我们很难深入的接触和使用编程技术; 笔者认为自动化测试尽管有很多不足,更不能完全替代手工测试,但确实是测试人员发 展的一个方向,越来越多的公司在实践自动化,越来多的项目在尝试自动化;所以对于功能 测试人员来讲,掌握项目自动化测试技术自然能提高测试技术水平,能够保持不被淘汰,又 能在激烈的竞争中处于优势地位。 为什么选python,因为他语法简单;如果你有一点C 语言或java 语言基础的,将会非 常容易地学会并使用python。自动化脚本本身要比开发程序简单得多,大多人学编程半途而 废就是没有实践的机会;那么通过selenium webdriver python 进行自动化测试,很快就可以 学以致用,建立继续学习的信心与动力;可以平滑的过渡到真正的编程经验上。 如果要使用java 或ruby 语言通过selenium webdriver 来实施自动化测试,虽然各种语 言的语法有差别,但思路是相通的;相信本文档依然可以提供给你学习的思路。 继续在这里感谢: 感谢购买第二版的同学,谢谢你们对本人劳动成果的支持!也正是你们时常问我还出不 出第三版了,也是你们的鼓励,让我继续学习整理本文档。 感谢乙醇前辈,第二版的文档是放在他的淘宝网站上卖的,感谢他的帮忙。 最最感谢的还是兔子( MarkRabbit ),好吧!他已经极力抗议叫兔子了,哈哈!本文 档中相当多的知识点是他提供的,不过他只提供思路,不提供解决问题的具体代码;我需要 把他的话截图下来,反复理解,然后找具体的解决代码,因此,我python 的语言能力提高 了不少。 下面要简单说说本文档的内容: 《selenium webdriver python (第三版)》相比第二版增加测试套件,参数化问题,引入 HTMLTestRunner ,测试结构的调整,相对来说比较好的构建了测试结构(只能用是“结构”, 离“架构”还差得呢!) 本文档仍然有很多不足够,毕竟不是以出书的标准来要求的,可能很多知识点解释的不 透彻,甚至错误的地方,请提出你的意见给本人。 本文档不是API,所以还有很多方法没有整理,如果在学习的过程中有任何疑问,请查 阅在线AIP 文档: http://selenium.googlecode.com/git/docs/api/py/index.html 2013.10.31 博客园—虫师 http://3 fnng.cnblogs.com 目录 一、selenium+python 环境搭建................................................................................................6 1.1 selenium 介绍............................................................................................................... 6 1.2 准备工作......................................................................................................................6 1.3 安装步骤......................................................................................................................7 1.4 安装chrome driver...................................................................................................... 8 1.5 安装IE driver................................................................................ 9 二、开始第一个脚本.................................................................................................................9 2.1 为什么选python..........................................................................................................9 2.2 第一个脚本..................................................................................................................9 2.3 脚本解析....................................................................................................................10 三、元素的定位....................................................................................................................... 11 3.1 id 和name 定位.......................................................................................................12 3.2 tag name 和class name 定位...................................................................................12 3.3 CSS 定位..................................................................................................................13 3.4 XPath 定位...............................................................................................................14 3.5 link 定位...................................................................................................................15 3.6 Partial link text 定位................................................................................................ 15 四、添加等待时间...................................................................................................................15 4.1、添加休眠..................................................................................................................15 4.2、智能等待..................................................................................................................16 五、打印信息...........................................................................................................................17 5.1、打印tile....................................................................................................................17 5.2、打印URL.................................................................................................................17 六、浏览器的操作...................................................................................................................18 6.1、浏览器最大化..........................................................................................................18 6.2、设置浏览器宽、高..................................................................................................19 七、操作浏览器的前进、后退...............................................................................................19 八、操作测试对象...................................................................................................................20 8.1、鼠标点击与键盘输入..............................................................................................21 8.2、submit 提交表单......................................................................................................21 8.3、text 获取元素文本...................................................................................................22 8.4、get_attribute 获得属性值........................................................................................ 22 九、键盘事件...........................................................................................................................23 9.1、键盘按键用法..........................................................................................................23 9.2、键盘组合键用法......................................................................................................24 9.3、中文乱码问题..........................................................................................................25 十、鼠标事件...........................................................................................................................25 10.1、鼠标右键................................................................................................................26 博客园—虫师 http://4 fnng.cnblogs.com 10.2、鼠标双击................................................................................................................27 10.3、鼠标拖放................................................................................................................27 十一、定位一组元素...............................................................................................................28 11.1、第一种定位方法....................................................................................................30 11.2、第二种定位方法....................................................................................................31 11.3、去掉最后一个勾选................................................................................................31 十二、多层框架/窗口定位......................................................................................................32 12.1、多层框架定位........................................................................................................32 12.2、多层窗口定位........................................................................................................35 十三、层级定位.......................................................................................................................35 十四、上传文件操作...............................................................................................................38 14.1、操作文件上传例子................................................................................................39 14.2、139 邮箱上传.........................................................................................................40 十五、下拉框处理...................................................................................................................41 15.1、操作下拉框例子....................................................................................................41 15.2、百度搜索设置下拉框操作....................................................................................43 十六、alert、confirm、prompt 的处理.................................................................................. 44 十七、对话框的处理...............................................................................................................45 17.1、div 对话框的处理..................................................................................................45 17.2、一般对话框的处理................................................................................................48 十八、调用js........................................................................................................................... 49 18.1、通过js 隐藏元素................................................................................................... 49 18.2、通过js 使输入框标红...........................................................................................51 十九、控制浏览器滚动条.......................................................................................................52 19.1、场景一....................................................................................................................53 19.2、场景二....................................................................................................................53 二十、cookie 处理................................................................................................................... 54 20.1、打印cookie 信息................................................................................................... 54 20.2、对cookie 操作....................................................................................................... 55 20.3、博客园登陆分析cookie........................................................................................56 二十一、webdriver 原理解析................................................................................................. 57 二十二、引入unittest 框架.....................................................................................................65 二十三、unittest 单元测试框架解析......................................................................................70 二十四、批量执行测试集.......................................................................................................75 二十五、异常捕捉与错误截图...............................................................................................77 二十六、生成测试报告(HTMLTestRunner).......................................................................... 80 二十七、数据驱动测试...........................................................................................................83 27.1、读取文件参数化....................................................................................................83 27.2、用户名密码的参数化(读取文件)................................................................... 85 27.3、用户名的参数化(字典)....................................................................................86 27.4、用户名密码的参数化(函数)........................................................................... 87 二十八、测试套件...................................................................................................................89 28.1、测试套件实例........................................................................................................89 28.2、整合HTMLTestRunner 测试报告........................................................................ 93 博客园—虫师 http://5 fnng.cnblogs.com 28.3、更易读的报告........................................................................................................95 二十九、结构改进...................................................................................................................96 29.1、all_tests.py 移出来................................................................................................96 29.2、init.py 文件解析............................................................................................ 97 29.3、调用多级目录的用例............................................................................................98 29.4、改进用例的读取....................................................................................................99 29.5、进一步分离用例列表..........................................................................................101 三十、UliPad--python 开发利器...........................................................................................103 博客园—虫师 http://6 fnng.cnblogs.com 一、selenium+python 环境搭建 1.1 selenium 介绍 selenium 是一个web 的自动化测试工具,不少学习功能自动化的同学开始首选selenium , 相因为它相比QTP 有诸多有点:
- 免费,也不用再为破解QTP 而大伤脑筋
- 小巧,对于不同的语言它只是一个包而已,而QTP 需要下载安装1个多G 的程序。
- 这也是最重要的一点,不管你以前更熟悉C、java、ruby、python、或都是C# ,你都 可以通过selenium 完成自动化测试,而QTP 只支持VBS
- 支持多平台:windows、linux、MAC ,支持多浏览器:ie、ff、safari、opera、chrome
- 支持分布式测试用例的执行,可以把测试用例分布到不同的测试机器的执行,相当于分 发机的功能。 1.2 准备工作 搭建平台windows 准备工具如下:
下载python http://python.org/getit/ 下载setuptools 【python 的基础包工具】 http://pypi.python.org/pypi/setuptools 下载pip 【python 的安装包管理工具】 https://pypi.python.org/pypi/pip
因为版本都在更新,pyhton 选择2.7.xx ,setuptools 选择你平台对应的版本,pip 不要 担心tar.gz 在windows 下一样可用。 博客园—虫师 http://7 fnng.cnblogs.com 1.3 安装步骤 一、python 的安装,这个不解释,exe 文件运行安装即可,既然你选择python,相信 你是熟悉python 的,我安装目录C:\Python27 二、setuptools 的安装也非常简单,同样是exe 文件,默认会找到python 的安装路径, 将安装到C:\Python27\Lib\site-packages 目录下 三、安装pip ,我默认解压在了C:\pip-1.3.1 目录下 四、打开命令提示符(开始---cmd 回车)进入C:\pip-1.3.1目录下输入: C:\pip-1.3.1 > python setup.py install (如果提示python 不是内部或外部命令!别急,去配置一下环境变量吧) 修改我的电脑->属性->高级->环境变量->系统变量中的PATH 为: 变量名:PATH 变量值:;C:\Python27 五、再切换到C:\Python27\Scripts 目录下输入: C:\Python27\Scripts > easy_install pip 六、安装selenium,(下载地址: https://pypi.python.org/pypi/selenium ) 如果是联网状态的话,可以直接在C:\Python27\Scripts 下输入命令安装: C:\Python27\Scripts > pip install -U selenium 如果没联网(这个一般不太可能),下载selenium 2.33.0 (目前的最新版本) 并解压把整个目录放到C:\Python27\Lib\site-packages 目录下。 注意:七、八两步可以暂不进行,如果你要学习第二十一章webdriver 原理的时候再进行 也不迟。
博客园—虫师 http://8 fnng.cnblogs.com 七、下载并安装 (http://www.java.com/zh_CN/download/chrome.jsp?locale=zh_CN),什么!?你没整过 java 虚拟机,百度一下java 环境搭建吧。 八、下载selenium 的服务端(https://code.google.com/p/selenium/)在页面的左 侧列表中找到 selenium-server-standalone-XXX.jar 对!就是这个东西,把它下载下来并解压; 在selenium-server-standalone-xxx.jar 目录下使用命令java -jar selenium-server-standalone-xxx.jar 启动(如果打不开,查看是否端口被占用:netstat -aon|findstr 4444)。
1.4 安装chrome driver chrome driver 的下载地址在这里。
- 下载解压,你会得到一个chromedriver.exe 文件(我点开,运行提示started no prot 9515 ,这是干嘛的?端口9515被占了?中间折腾了半天),后来才知道需要把这家伙放到 chrome 的安装目录下...\Google\Chrome\Application\ ,然后设置path 环境变量,把 chrome 的安装目录(我的:C:\Program Files\Google\Chrome\Application),然后再调用 运行:
from selenium import webdriver driver =webdriver.Chrome() driver.get('http://radar.kuaibo.com') print driver.title driver.quit() 报错提示: Chrome version must be >= 27.0.1453.0\n (Driver info: chromedriver=2.0,platform=Windows NT 5.1 SP3 x86) 说我chrome 的版本没有大于27.0.1453.0 ,这个好办,更新到最新版本即可。 博客园—虫师 http://9 fnng.cnblogs.com 1.5 安装IE driver 在新版本的webdriver 中,只有安装了ie driver 使用ie 进行测试工作。 ie driver 的下载地址在这里,记得根据自己机器的操作系统版本来下载相应的driver。 暂时还没尝试,应该和chrome 的安装方式类似。 记得配置IE 的保护模式 如果要使用webdriver 启动IE 的话,那么就需要配置IE 的保护模式了。 把IE 里的保护模式都选上或都勾掉就可以了。 二、开始第一个脚本 2.1 为什么选python 之前的菜鸟系列是基于java 的,一年没学其实也忘的差不多了,目前所测的产品 部分也是python 写的,而且团队也在推广python ,其实就测试人员来说,python 也 相当受欢迎。易学,易用。翻翻各测试招聘,python 出现的概率也颇高。(个人原因) 最重要的还是python 简单易学,应用也相对广泛;是测试人员学习编程的不二之选。 下面看看python 穿上selenium webdriver 是多么的性感: 2.2 第一个脚本
from selenium import webdriver browser = webdriver.Firefox() browser.get("http://www.baidu.com") browser.find_element_by_id("kw").send_keys("selenium") browser.find_element_by_id("su").click() 博客园—虫师 http://10 fnng.cnblogs.com browser.quit() 2.3 脚本解析
可加可不加,开发人员喜欢加一下,防止乱码嘛。 from selenium import webdriver 要想使用selenium 的webdriver 里的函数,首先把包导进来嘛 browser = webdriver.Firefox() 我们需要操控哪个浏览器呢?Firefox ,当然也可以换成Ie 或Chrome 。browser 可以 随便取,但后面要用它操纵各种函数执行。 browser.find_element_by_id("kw").send_keys("selenium") 一个控件有若干属性id 、name、(也可以用其它方式定位),百度输入框的id 叫kw , 我要在输入框里输入selenium 。多自然语言呀! browser.find_element_by_id("su").click() 搜索的按钮的id 叫su ,我需要点一下按钮( click() )。 browser.quit() 退出并关闭窗口的每一个相关的驱动程序,有洁癖用这个。 browser.close() 关闭当前窗口,用哪个看你的需求了。 博客园—虫师 http://11 fnng.cnblogs.com 三、元素的定位 对象的定位应该是自动化测试的核心,要想操作一个对象,首先应该识别这个对象。 一个对象就是一个人一样,他会有各种的特征(属性),如比我们可以通过一个人的身 份证号,姓名,或者他住在哪个街道、楼层、门牌找到这个人。 那么一个对象也有类似的属性,我们可以通过这个属性找到这对象。 webdriver 提供了一系列的对象定位方法,常用的有以下几种 ? · id ? · name ? · class name ? · link text ? · partial link text ? · tag name ? · xpath ? · css selector 我们可以看到,一个百度的输入框,可以用这么用种方式去定位。 #coding=utf-8 from selenium import webdriver browser = webdriver.Firefox() browser.get("http://www.baidu.com") #########百度输入框的定位方式########## #通过id 方式定位 browser.find_element_by_id("kw").send_keys("selenium") #通过name 方式定位 browser.find_element_by_name("wd").send_keys("selenium") #通过tag name 方式定位 browser.find_element_by_tag_name("input").send_keys("selenium") #通过class name 方式定位 browser.find_element_by_class_name("s_ipt").send_keys("selenium") 博客园—虫师 http://12 fnng.cnblogs.com #通过CSS 方式定位 browser.find_element_by_css_selector("#kw").send_keys("selenium") #通过xphan 方式定位 browser.find_element_by_xpath("//input[@id='kw']").send_keys("selenium") ############################################ browser.find_element_by_id("su").click() time.sleep(3) browser.quit() 3.1 id 和name 定位 id 和name 是我们最最常用的定位方式,因为大多数控件都有这两个属性,而且 在对控件的id 和name 命名时一般使其有意义也会取不同的名字。通过这两个属性使我 们找一个页面上的属性变得相当容易 我们通过前端工具,找到了百度输入框的属性信息,如下: id=”kw” 通过find_element_by_id("kw") 函数就是捕获到百度输入框 name=”wd” 通过find_element_by_name("wd")函数同样也可以捕获百度输入框 3.2 tag name 和class name 定位 从上面的百度输入框的属性信息中,我们看到,不单单只有id 和name 两个属性, 比如class 和tag name(标签名) 博客园—虫师 http://13 fnng.cnblogs.com input 就是一个标签的名字,可以通过find_element_by_tag_name("input") 函数来定 位。 class="s_ipt" 通过find_element_by_class_name("s_ipt")函数捕获百度输入框。 3.3 CSS 定位 CSS(Cascading Style Sheets)是一种语言,它被用来描述HTML 和XML 文档的表现。 CSS 使用选择器来为页面元素绑定属性。这些选择器可以被selenium 用作另外的定位策 略。 CSS 的比较灵活可以选择控件的任意属性,上面的例子中: find_element_by_css_selector("#kw") 通过find_element_by_css_selector( )函数,选择取百度输入框的id 属性来定义 也可以取name 属性 新闻 driver.find_element_by_css_selector("a[name="tj_news"]").click() 可以取title 属性 网页 driver.find_element_by_css_selector("a[title="web"]").click() 也可以是取..: driver.find_element_by_css_selector("a.RecycleBin").click() 虽然我也没全部理解CSS 的定位,但是看上去应该是一种非常灵活和牛X 的定位方式 扩展阅读: http://www.w3.org/TR/css3-selectors/ 博客园—虫师 http://14 fnng.cnblogs.com http://www.w3school.com.cn/css/css_positioning.asp 3.4 XPath 定位 什么是XPath:http://www.w3.org/TR/xpath/ XPath 基础教程:http://www.w3schools.com/xpath/default.asp selenium 中被误解的XPath : http://magustest.com/blog/category/webdriver/ XPath 是一种在XML 文档中定位元素的语言。因为HTML 可以看做XML 的一种实现, 所以selenium 用户可是使用这种强大语言在web 应用中定位元素。 XPath 扩展了上面id 和name 定位方式,提供了很多种可能性,比如定位页面上的 第三个多选框。 xpath:attributer (属性) driver.find_element_by_xpath("//input[@id='kw']").send_keys("selenium") #input 标签下id =kw 的元素 xpath:idRelative (id 相关性) driver.find_element_by_xpath("//div[@id='fm']/form/span/input").send_keys("s elenium") #在/form/span/input 层级标签下有个div 标签的id=fm 的元素 driver.find_element_by_xpath("//tr[@id='check']/td[2]").click()
xpath:position (位置) driver.find_element_by_xpath("//input").send_keys("selenium") driver.find_element_by_xpath("//tr[7]/td[2]").click() #第7个tr 里面的第2个td xpath: href (水平参考) driver.find_element_by_xpath("//a[contains(text(),'网页')]").click() #在a 标签下有个文本(text)包含(contains)'网页' 的元素 xpath:link driver.find_element_by_xpath("//a[@href='http://www.baidu.com/']").click() #有个叫a 的标签,他有个链接href='http://www.baidu.com/ 的元素 博客园—虫师 http://15 fnng.cnblogs.com 3.5 link 定位 有时候不是一个输入框也不是一个按钮,而是一个文字链接,我们可以通过link #coding=utf-8 from selenium import webdriver browser = webdriver.Firefox() browser.get("http://www.baidu.com") browser.find_element_by_link_text("贴吧").click() browser.quit() 一般一个页面上不会出现相同的文件链接,通过文字链接来定位也是一种简单有效 的定位方式。 3.6 Partial link text 定位 通过部分链接定位,这个有时候也会用到,我还没有想到很好的用处。拿上面的例 子,我可以只用链接的一部分文字进行匹配: browser.find_element_by_partial_link_text("贴").click() #通过find_element_by_partial_link_text() 函数,我只用了“贴”字,脚本一样找到了"贴吧 " 的链接 四、添加等待时间 有时候为了保证脚本运行的稳定性,需要脚本中添加等待时间。 4.1、添加休眠 添加休眠非常简单,我们需要引入time 包,就可以在脚本中自由的添加休眠时间了。
博客园—虫师 http://16 fnng.cnblogs.com from selenium import webdriver import time #调入time 函数 browser = webdriver.Firefox() browser.get("http://www.baidu.com") time.sleep(0.3) #休眠0.3秒 browser.find_element_by_id("kw").send_keys("selenium") browser.find_element_by_id("su").click() time.sleep(3) # 休眠3秒 browser.quit() 4.2、智能等待 通过添加implicitly_wait() 方法就可以方便的实现智能等待;implicitly_wait(30) 的用法应该比time.sleep() 更智能,后者只能选择一个固定的时间的等待,前者可以 在一个时间范围内智能的等待。 文档解释: selenium.webdriver.remote.webdriver.implicitly_wait(time_to_wait) 隐式地等待一个无素被发现或一个命令完成;这个方法每次会话只需要调用一次 time_to_wait: 等待时间 用法: browser.implicitly_wait(30)
from selenium import webdriver import time #调入time 函数 browser = webdriver.Firefox() browser.get("http://www.baidu.com") browser.implicitly_wait(30) #智能等待30秒 browser.find_element_by_id("kw").send_keys("selenium") browser.find_element_by_id("su").click() browser.quit() 博客园—虫师 http://17 fnng.cnblogs.com 五、打印信息 很多时间我们不可能盯着脚本执行,我们需要一些打印信息来证明脚本运行是否正确: 5.1、打印tile 把刚才访问页面的title 打印出来。 coding = utf-8 from selenium import webdriver driver = webdriver.Chrome() driver.get('http://www.baidu.com') print driver.title # 把页面title 打印出来 driver.quit() 虽然我没看到脚本的执行过程,但我在执行结果里看到了
百度一下,你就知道 说明页面正确被我打开了。 5.2、打印URL 可以将浏览器的title 打印出来,这里再讲个简单的,把当前URL 打印出来。其实 也没啥大用,可以做个凑数的用例。 #coding=utf-8 from selenium import webdriver import time browser = webdriver.Firefox() url= 'http://www.baidu.com' 博客园—虫师 http://18 fnng.cnblogs.com #通过get 方法获取当前URL 打印 print "now access %s" %(url) browser.get(url) time.sleep(2) browser.find_element_by_id("kw").send_keys("selenium") browser.find_element_by_id("su").click() time.sleep(3) browser.quit() 六、浏览器的操作 6.1、浏览器最大化 我们知道调用启动的浏览器不是全屏的,这样不会影响脚本的执行,但是有时候会 影响我们“观看”脚本的执行。 #coding=utf-8 from selenium import webdriver import time browser = webdriver.Firefox() browser.get("http://www.baidu.com") print "浏览器最大化" browser.maximize_window() #将浏览器最大化显示 time.sleep(2) browser.find_element_by_id("kw").send_keys("selenium") browser.find_element_by_id("su").click() time.sleep(3) browser.quit() 博客园—虫师 http://19 fnng.cnblogs.com 6.2、设置浏览器宽、高 最大化还是不够灵活,能不能随意的设置浏览的宽、高显示?当然是可以的。 #coding=utf-8 from selenium import webdriver import time browser = webdriver.Firefox() browser.get("http://m.mail.10086.cn") time.sleep(2) #参数数字为像素点 print "设置浏览器宽480、高800显示" browser.set_window_size(480, 800) time.sleep(3) browser.quit() 七、操作浏览器的前进、后退 浏览器上有一个后退、前进按钮,对于浏览网页的人是比较方便的;对于做web 自 动化测试的同学来说应该算是一个比较难模拟的问题;其实很简单,下面看看python 的实现方式。 #coding=utf-8 from selenium import webdriver import time browser = webdriver.Firefox() #访问百度首页 first_url= 'http://www.baidu.com' 博客园—虫师 http://20 fnng.cnblogs.com print "now access %s" %(first_url) browser.get(first_url) time.sleep(2) #访问新闻页面 second_url='http://news.baidu.com' print "now access %s" %(second_url) browser.get(second_url) time.sleep(2) #返回(后退)到百度首页 print "back to %s "%(first_url) browser.back() time.sleep(1) #前进到新闻页 print "forward to %s"%(second_url) browser.forward() time.sleep(2) browser.quit() 为了使过程让你看得更清晰,在每一步操作上都加了print 和sleep 。 说实话,这两个功能平时不太常用,所能想到的场景就是几个页面来回跳转,但又 不想用get url 的情况下。 八、操作测试对象 前面讲到了不少知识都是定位元素,定位只是第一步,定位之后需要对这个原素进 行操作。鼠标点击呢还是键盘输入,这要取决于我们定位的是按钮还输入框。 博客园—虫师 http://21 fnng.cnblogs.com 一般来说,webdriver 中比较常用的操作对象的方法有下面几个 ? click 点击对象 ? send_keys 在对象上模拟按键输入 ? clear 清除对象的内容,如果可以的话 ? submit 清除对象的内容,如果可以的话 ? text 用于获取元素的文本信息 8.1、鼠标点击与键盘输入 在我们本系列开篇的第一个例子里就用到了到click 和send_skys ,别翻回去找 了,我再贴一下代码: coding=utf-8 from selenium import webdriver import time driver = webdriver.Firefox() driver.get("http://www.baidu.com") driver.find_element_by_id("kw").clear() driver.find_element_by_id("kw").send_keys("selenium") time.sleep(2) #通过submit() 来操作 driver.find_element_by_id("su").submit() time.sleep(3) driver.quit() send_keys("xx") 用于在一个输入框里输入xx 内容。 click() 用于点击一个按钮。 clear() 用于清除输入框的内容,比如百度输入框里默认有个“请输入关键 字”的信息,再比如我们的登陆框一般默认会有“账号”“密码”这样的默认信息。 clear 可以帮助我们清除这些信息。 8.2、submit 提交表单 我们把“百度一下”的操作从click 换成submit 可以达到相同的效果: #coding=utf-8 from selenium import webdriver import time 博客园—虫师 http://22 fnng.cnblogs.com driver = webdriver.Firefox() driver.get("http://www.baidu.com") driver.find_element_by_id("kw").send_keys("selenium") time.sleep(2) #通过submit() 来操作 driver.find_element_by_id("su").submit() time.sleep(3) driver.quit() 8.3、text 获取元素文本 text 用于获取元素的文本信息 下面把百度首页底部的声明打印输出 #coding=utf-8 from selenium import webdriver import time driver = webdriver.Firefox() driver.get("http://www.baidu.com") time.sleep(2) #id = cp 元素的文本信息 data=driver.find_element_by_id("cp").text print data #打印信息 time.sleep(3) driver.quit() 输出:
?2013 Baidu 使用百度前必读京ICP 证030173号 8.4、get_attribute 获得属性值 get_attribute 博客园—虫师 http://23 fnng.cnblogs.com 获得属性值。 这个函数的用法前面已经有出现过,在定位一组元素的时候有使用到它,只是我们 没有做过多的解释。 一般用法: select = driver.find_element_by_tag_name("select") allOptions = select.find_elements_by_tag_name("option") for option in allOptions: print "Value is: " + option.get_attribute("value") option.click() ..... 具体应用参考第十一节层级定位例子。 九、键盘事件 本章重点: ? 键盘按键用法 ? 键盘组合键用法 ? send_keys() 输入中文乱码问题 9.1、键盘按键用法 #coding=utf-8 from selenium import webdriver from selenium.webdriver.common.keys import Keys #需要引入keys 包 import os,time driver = webdriver.Firefox() driver.get("http://passport.kuaibo.com/login/?referrer=http%3A%2F%2Fwebcloud .kuaibo.com%2F") 博客园—虫师 http://24 fnng.cnblogs.com time.sleep(3) driver.maximize_window() # 浏览器全屏显示 driver.find_element_by_id("user_name").clear() driver.find_element_by_id("user_name").send_keys("fnngj") #tab 的定位相相于清除了密码框的默认提示信息,等同上面的clear() driver.find_element_by_id("user_name").send_keys(Keys.TAB) time.sleep(3) driver.find_element_by_id("user_pwd").send_keys("123456") #通过定位密码框,enter(回车)来代替登陆按钮 driver.find_element_by_id("user_pwd").send_keys(Keys.ENTER) ''' #也可定位登陆按钮,通过enter(回车)代替click() driver.find_element_by_id("login").send_keys(Keys.ENTER) ''' time.sleep(3) driver.quit() 要想调用键盘按键操作需要引入keys 包: from selenium.webdriver.common.keys import Keys 通过send_keys()调用按键: send_keys(Keys.TAB) # TAB send_keys(Keys.ENTER) # 回车 注意:这个操作和页面元素的遍历顺序有关,假如当前定位在账号输入框,按键 盘的tab 键后遍历的不是密码框,那就不法输入密码。假如输入密码后,还有 需要填写验证码,那么回车也起不到登陆的效果。 9.2、键盘组合键用法 #coding=utf-8 from selenium import webdriver from selenium.webdriver.common.keys import Keys import time driver = webdriver.Firefox() driver.get("http://www.baidu.com") 博客园—虫师 http://25 fnng.cnblogs.com #输入框输入内容 driver.find_element_by_id("kw").send_keys("selenium") time.sleep(3) #ctrl+a 全选输入框内容 driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a') time.sleep(3) #ctrl+x 剪切输入框内容 driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x') time.sleep(3) #输入框重新输入内容,搜索 driver.find_element_by_id("kw").send_keys(u"虫师cnblogs") driver.find_element_by_id("su").click() time.sleep(3) driver.quit() 上面的操作没有实际意义,但向我们演示了键盘组合按键的用法。 9.3、中文乱码问题 selenium2 python 在send_keys()中输入中文一直报错,其实前面加个小u 就解决了: coding=utf-8 send_keys(u"输入中文") 需要注意的是utf-8并不是万能的,我们需要保持脚本、浏览器、程序三者编码之 间的转换;如果utf-8不能解决,可以尝试GBK 或修改浏览器的默认编码。 十、鼠标事件 本章重点: ActionChains 类 ? context_click() 右击 ? double_click() 双击 ? drag_and_drop() 拖动 测试的产品中有一个操作是右键点击文件列表会弹出一个快捷菜单,可以方 便的选择快捷菜单中的选择对文件进行操作(删除、移动、重命名),之前学习 元素的点击非常简单: driver.find_element_by_id(“xxx”).click() 博客园—虫师 http://26 fnng.cnblogs.com 那么鼠标的双击、右击、拖动等是否也是这样的写法呢?例如右击: driver.find_element_by_id(“xxx”).context_click() 经过运行脚本得到了下面的错误提示: AttributeError: 'WebElement' object has no attribute 'context_click' 提示右点方法不属于webelement 对象, 通过查找文档, 发现属于 ActionChains 类,但文档中没有具体写法。这里要感谢北京-QC-rabbit 的指 点,其实整个python+selenium 学习过程都要感谢北京-QC-rabbit 的指点。 10.1、鼠标右键 下面介绍鼠标右键的用法,以快播私有云为例: #coding=utf-8 from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains import time driver = webdriver.Firefox() driver.get("http://passport.kuaibo.com/login/?referrer=http%3A%2F%2Fwebcloud .kuaibo.com%2F") #登陆快播私有云 driver.find_element_by_id("user_name").send_keys("username") driver.find_element_by_id("user_pwd").send_keys("123456") driver.find_element_by_id("dl_an_submit").click() time.sleep(3) #定位到要右击的元素 qqq =driver.find_element_by_xpath("/html/body/div/div[2]/div[2]/div/div[3]/table /tbody/tr/td[2]") #对定位到的元素执行鼠标右键操作 ActionChains(driver).context_click(qqq).perform() 博客园—虫师 http://27 fnng.cnblogs.com ''' #你也可以使用三行的写法,但我觉得上面两行写法更容易理解 chain = ActionChains(driver) implement = driver.find_element_by_xpath("/html/body/div/div[2]/div[2]/div/div[3]/table/ tbody/tr/td[2]") chain.context_click(implement).perform() ''' time.sleep(3) #休眠3秒 driver.close() 这里需要注意的是,在使用ActionChains 类之前,要先将包引入。 右击的操作会了,下面的其它方法比葫芦画瓢也能写出来。 10.2、鼠标双击 鼠标双击的写法: #定位到要双击的元素 qqq =driver.find_element_by_xpath("xxx") #对定位到的元素执行鼠标双击操作 ActionChains(driver).double_click(qqq).perform() 10.3、鼠标拖放 鼠标拖放操作的写法: #定位元素的原位置 element = driver.find_element_by_name("source") #定位元素要移动到的目标位置 target = driver.find_element_by_name("target") 博客园—虫师 http://28 fnng.cnblogs.com #执行元素的移动操作 ActionChains(driver).drag_and_drop(element, target).perform() 十一、定位一组元素 webdriver 可以很方便的使用findElement 方法来定位某个特定的对象,不过有时 候我们却需要定位一组对象,这时候就需要使用findElements 方法。 定位一组对象一般用于以下场景: ? 批量操作对象,比如将页面上所有的checkbox 都勾上 ? 先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。比如定位出页 面上所有的checkbox,然后选择最后一个 checkbox.html
<title>Checkbox</title> <script type="text/javascript" async="" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"> script>