您的当前位置:首页正文

selenium_webdriver(python)第一版

来源:化拓教育网
博客园—虫师seleniumwebdriver(python)

(第一版)

声明:本文档以免费形式传播,禁止用于任何商业用途,如果要用于商业请联系作者,欢迎一切免费形式的传播,请著名博客园--虫师的信息。1http://fnng.cnblogs.com博客园—虫师前言如果你是一位有python语言基础的同学,又想通过python+selenium去实施自动化,那么你非常幸运的找到了这份文档,我也非常荣幸能为你的自动化学习之路带来一丝帮助。其实,我在selenium自动化方面也是初学者,虽然在刚开始从事测试工作的就尝试学习selenium自动化工具,购买了面《零成本实现web自动化测试---基于seleinum与

Bromine》学了一段时间不得门,当时水平有限,甚至一直都不理解什么自动化测试框架,后来就放弃了自动化的学习。今年换工作后,所测试的项目用python开发,为了更好的测试项目,开始学习python语言,花一个月多月的时候将python基础学习了一下。正好所测试的项目也比较适合进行自动化,于是尝试通过python+selenium对项目进行自动化工作。学习的过程还是比较艰难的,对于seleniumwebdriver的ruby和java的实例比较多,python甚少,查询API文档有方法,但没有实例,不知道如何实现。在学习过程中要感谢乙醇同学,他在ruby+selenium方面有很深的功力;另一位要感谢的是rabbit,他在python+selenium的学习中给我了很多帮助。下面要简单说说本文档的内容:为了学习seleniumwebdriver本身的用法,全文没有引入python的unittest测试框架;所有的脚本也都是单个的用例的学习,引入框架后将会提供更强大的功能,比如用例的运行时间,用例的批量执行等。本文档是第一版,我此后也会继续学习unittest测试框架的技术,并将在第二版中加入。本文档不是API,所以还有很多方法没有整理,如果在学习的过程中有任何疑问,请查阅在线AIP文档:http://selenium.googlecode.com/git/docs/api/py/index.html2013.8.302http://fnng.cnblogs.com博客园—虫师目录一、selenium+python环境搭建................................................................................................41.1selenium介绍...............................................................................................................41.2准备工作......................................................................................................................41.3安装步骤......................................................................................................................51.4安装chromedriver......................................................................................................61.5安装IEdriver................................................................................7二、开始第一个脚本.................................................................................................................72.1为什么选python..........................................................................................................72.2第一个脚本..................................................................................................................72.3脚本解析......................................................................................................................8三、元素的定位.........................................................................................................................93.1id和name定位.......................................................................................................113.2tagname和classname定位...................................................................................113.3CSS定位..................................................................................................................113.4XPath定位...............................................................................................................123.5link定位...................................................................................................................143.6Partiallinktext定位................................................................................................14四、添加等待时间...................................................................................................................144.1、添加休眠..................................................................................................................154.2、智能等待..................................................................................................................15五、打印信息...........................................................................................................................165.1、打印tile....................................................................................................................165.2、打印URL.................................................................................................................17六、浏览器的操作...................................................................................................................186.1、浏览器最大化..........................................................................................................186.2、设置浏览器宽、高..................................................................................................19七、操作浏览器的前进、后退...............................................................................................19八、操作测试对象...................................................................................................................21九、键盘事件...........................................................................................................................229.1、键盘按键用法..........................................................................................................239.1、键盘组合键用法......................................................................................................24十、鼠标事件...........................................................................................................................2510.1、鼠标右键................................................................................................................2610.2、鼠标双击................................................................................................................2710.3、鼠标拖放................................................................................................................28十一、定位一组元素...............................................................................................................2811.1、第一种定位方法....................................................................................................3011.2、第二种定位方法....................................................................................................303http://fnng.cnblogs.com博客园—虫师11.3、去掉最后一个勾选................................................................................................31十二、多层框架/窗口定位......................................................................................................3212.1、多层框架定位........................................................................................................3312.1、多层窗口定位........................................................................................................35十三、层级定位.......................................................................................................................35十四、上传文件操作...............................................................................................................3914.1、操作文件上传例子................................................................................................3914.2、139邮箱上传.........................................................................................................40十五、下拉框处理...................................................................................................................4115.1、操作下拉框例子....................................................................................................4215.2、百度搜索设置下拉框操作....................................................................................43十六、调用js...........................................................................................................................4415.1、通过js隐藏元素...................................................................................................4515.2、通过js使输入框标红...........................................................................................47十六、控制浏览器滚动条.......................................................................................................4816.1、场景一....................................................................................................................4816.1、场景二....................................................................................................................48十七、webdriver原理解析.....................................................................................................494http://fnng.cnblogs.com博客园—虫师一、selenium+python环境搭建1.1selenium介绍

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下一样可用。

5http://fnng.cnblogs.com博客园—虫师1.3安装步骤

1、python的安装,这个不解释,exe文件运行安装即可,既然你选择python,相信你是熟悉python的,我安装目录C:\\Python272、setuptools的安装也非常简单,同样是exe文件,默认会找到python的安装路径,将安装到C:\\Python27\\Lib\\site-packages目录下3、安装pip,我默认解压在了C:\\pip-1.3.1目录下4、打开命令提示符(开始---cmd回车)进入C:\\pip-1.3.1目录下输入:C:\\pip-1.3.1>pythonsetup.pyinstall(如果提示python不是内部或外部命令!别急,去配置一下环境变量吧)修改我的电脑->属性->高级->环境变量->系统变量中的PATH为:变量名:PATH变量值:;C:\\Python275、再切换到C:\\Python27\\Scripts目录下输入:C:\\Python27\\Scripts>easy_installpip

6、安装selenium,(下载地址:https://pypi.python.org/pypi/selenium如果是联网状态的话,可以直接在C:\\Python27\\Scripts下输入命令安装:C:\\Python27\\Scripts>pipinstall-Uselenium

如果没联网(这个一般不太可能),下载selenium2.33.0(目前的最新版本)并解压把整个目录放到C:\\Python27\\Lib\\site-packages目录下。

7、下载并安装(http://www.java.com/zh_CN/download/chrome.jsp?locale=zh_CN)什么?你没整过java,参考其它文档吧!这不难。

6http://fnng.cnblogs.com博客园—虫师8、下载selenium的服务端(https://code.google.com/p/selenium/)在页面的左侧列表中找到

selenium-server-standalone-XXX.jar对!就是这个东西,把它下载下来并解压;

在selenium-server-standalone-xxx.jar目录下使用命令java-jarselenium-server-standalone-xxx.jar启动(如果打不开,查看是否端口被占用:netstat-aon|findstr4444)。

1.4安装chromedriver

chromedriver的下载地址在这里。1.下载解压,你会得到一个chromedriver.exe文件(我点开,运行提示startednoprot9515,这是干嘛的?端口9515被占了?中间折腾了半天),后来才知道需要把这家伙放到chrome的安装目录下...\\Google\\Chrome\\Application\\,然后设置path环境变量,把chrome的安装目录(我的:C:\\ProgramFiles\\Google\\Chrome\\Application),然后再调用运行:#coding=utf-8fromseleniumimportwebdriverdriver=webdriver.Chrome()driver.get('http://radar.kuaibo.com')printdriver.titledriver.quit()报错提示:Chromeversionmustbe>=27.0.1453.0\\nchromedriver=2.0,platform=WindowsNT5.1SP3x86)(Driverinfo:说我chrome的版本没有大于27.0.1453.0,这个好办,更新到最新版本即可。7http://fnng.cnblogs.com博客园—虫师1.5安装IEdriver

在新版本的webdriver中,只有安装了iedriver使用ie进行测试工作。iedriver的下载地址在这里,记得根据自己机器的操作系统版本来下载相应的driver。暂时还没尝试,应该和chrome的安装方式类似。记得配置IE的保护模式如果要使用webdriver启动IE的话,那么就需要配置IE的保护模式了。把IE里的保护模式都选上或都勾掉就可以了。二、开始第一个脚本2.1为什么选python

之前的菜鸟系列是基于java的,一年没学其实也忘的差不多了,目前所测的产品部分也是python写的,而且团队也在推广python,其实就测试人员来说,python也相当受欢迎。易学,易用。翻翻各测试招聘,python出现的概率也颇高。(个人原因)

最重要的还是python简单易学,应用也相对广泛;是测试人员学习编程的不二之选。下面看看python穿上seleniumwebdriver是多么的性感:

2.2第一个脚本

#coding=utf-8fromseleniumimportwebdriver=webdriver.Firefox()browserbrowser.get(\"http://www.baidu.com\")browser.find_element_by_id(\"kw\").send_keys(\"selenium\")8http://fnng.cnblogs.com博客园—虫师browser.find_element_by_id(\"su\").click()browser.quit()2.3脚本解析

#coding=utf-8

可加可不加,开发人员喜欢加一下,防止乱码嘛。

fromseleniumimportwebdriver

要想使用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()

关闭当前窗口,用哪个看你的需求了。

9http://fnng.cnblogs.com博客园—虫师三、元素的定位

对象的定位应该是自动化测试的核心,要想操作一个对象,首先应该识别这个对象。一个对象就是一个人一样,他会有各种的特征(属性),如比我们可以通过一个人的身份证号,姓名,或者他住在哪个街道、楼层、门牌找到这个人。那么一个对象也有类似的属性,我们可以通过这个属性找到这对象。webdriver提供了一系列的对象定位方法,常用的有以下几种

········idname

classnamelinktext

partiallinktexttagnamexpath

cssselector

我们可以看到,一个百度的输入框,可以用这么用种方式去定位。#coding=utf-8fromseleniumimportwebdriver=webdriver.Firefox()browserbrowser.get(\"http://www.baidu.com\")#########百度输入框的定位方式###########通过id方式定位browser.find_element_by_id(\"kw\").send_keys(\"selenium\")10http://fnng.cnblogs.com博客园—虫师#通过name方式定位browser.find_element_by_name(\"wd\").send_keys(\"selenium\")#通过tagname方式定位browser.find_element_by_tag_name(\"input\").send_keys(\"selenium\")#通过classname方式定位browser.find_element_by_class_name(\"s_ipt\").send_keys(\"selenium\")#通过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()11http://fnng.cnblogs.com博客园—虫师3.1id和name定位

id和name是我们最最常用的定位方式,因为大多数控件都有这两个属性,而且在对控件的id和name命名时一般使其有意义也会取不同的名字。通过这两个属性使我们找一个页面上的属性变得相当容易

我们通过前端工具,找到了百度输入框的属性信息,如下:

id=”kw”

通过find_element_by_id(\"kw\")函数就是捕获到百度输入框name=”wd”

通过find_element_by_name(\"wd\")函数同样也可以捕获百度输入框

3.2tagname和classname定位

从上面的百度输入框的属性信息中,我们看到,不单单只有id和name两个属性,比如class和tagname(标签名)

input就是一个标签的名字,可以通过find_element_by_tag_name(\"input\")函数来定位。

class=\"s_ipt\"

通过find_element_by_class_name(\"s_ipt\")函数捕获百度输入框。

3.3CSS定位

CSS(CascadingStyleSheets)是一种语言,它被用来描述HTML和XML文档的表现。CSS使用选择器来为页面元素绑定属性。这些选择器可以被selenium用作另外的定位策略。CSS的比较灵活可以选择控件的任意属性,上面的例子中:12http://fnng.cnblogs.com博客园—虫师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://www.w3school.com.cn/css/css_positioning.asp3.4XPath定位

什么是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应用中定位元素。

13http://fnng.cnblogs.com博客园—虫师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(\"selenium\")#在/form/span/input层级标签下有个div标签的id=fm的元素driver.find_element_by_xpath(\"//tr[@id='check']/td[2]\").click()#id为'check'的tr,定闪他里面的第2个xpath:position(位置)driver.find_element_by_xpath(\"//input\").send_keys(\"selenium\")driver.find_element_by_xpath(\"//tr[7]/td[2]\").click()#第7个tr里面的第2个tdxpath:href(水平参考)driver.find_element_by_xpath(\"//a[contains(text(),'网页')]\").click()#在a标签下有个文本(text)包含(contains)'网页'的元素xpath:linkdriver.find_element_by_xpath(\"//a[@href='http://www.baidu.com/']\").click()#有个叫a的标签,他有个链接href='http://www.baidu.com/的元素14http://fnng.cnblogs.com博客园—虫师3.5link定位

有时候不是一个输入框也不是一个按钮,而是一个文字链接,我们可以通过link#coding=utf-8fromseleniumimportwebdriverbrowser=webdriver.Firefox()browser.get(\"http://www.baidu.com\")browser.find_element_by_link_text(\"贴吧\").click()browser.quit()一般一个那页面上不会出现相同的文件链接,通过文字链接来定位也是一种简单有效的定位方式。

3.6Partiallinktext定位

通过部分链接定位,这个有时候也会用到,我还没有想到很好的用处。拿上面的例子,我可以只用链接的一部分文字进行匹配:browser.find_element_by_partial_link_text(\"贴\").click()#通过find_element_by_partial_link_text()函数,我只用了“贴”字,脚本一样找到了\"贴吧\"的链接四、添加等待时间

有时候为了保证脚本运行的稳定性,需要脚本中添加等待时间。15http://fnng.cnblogs.com博客园—虫师4.1、添加休眠

添加休眠非常简单,我们需要引入time包,就可以在脚本中自由的添加休眠时间了。#coding=utf-8fromseleniumimportwebdrivertime#调入time函数=webdriver.Firefox()importbrowserbrowser.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:等待时间

16http://fnng.cnblogs.com博客园—虫师用法:browser.implicitly_wait(30)#coding=utf-8fromseleniumimportwebdrivertime#调入time函数=webdriver.Firefox()importbrowserbrowser.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()五、打印信息

很多时间我们不可能盯着脚本执行,我们需要一些打印信息来证明脚本运行是否正确:5.1、打印tile

把刚才访问页面的title打印出来。

17http://fnng.cnblogs.com博客园—虫师coding=utf-8fromseleniumimportwebdriver=webdriver.Chrome()driverdriver.get('http://www.baidu.com')printdriver.title#把页面title打印出来driver.quit()虽然我没看到脚本的执行过程,但我在执行结果里看到了>>>

百度一下,你就知道说明页面正确被我打开了。

5.2、打印URL

可以将浏览器的title打印出来,这里再讲个简单的,把当前URL打印出来。其实也没啥大用,可以做个凑数的用例。#coding=utf-8fromseleniumimportwebdriverimporttimebrowser=webdriver.Firefox()url='http://www.baidu.com'#通过get方法获取当前URL打印print\"nowaccess%s\"browser.get(url)%(url)18http://fnng.cnblogs.com博客园—虫师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-8fromseleniumimportwebdriverimporttimebrowser=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()19http://fnng.cnblogs.com博客园—虫师time.sleep(3)browser.quit()6.2、设置浏览器宽、高

最大化还是不够灵活,能不能随意的设置浏览的宽、高显示?当然是可以的。

#coding=utf-8fromseleniumimportwebdriverimporttimebrowser=webdriver.Firefox()browser.get(\"http://m.mail.10086.cn\")time.sleep(2)#参数数字为像素点print\"设置浏览器宽480、高800显示\"browser.set_window_size(480,800)browser.quit()time.sleep(3)七、操作浏览器的前进、后退

浏览器上有一个后退、前进按钮,对于浏览网页的人是比较方便的;对于做web自动化测试的同学来说应该算是一个比较难模拟的问题;其实很简单,下面看看python的实现方式。

#coding=utf-8fromseleniumimportwebdriverimporttime20http://fnng.cnblogs.com博客园—虫师browser=webdriver.Firefox()#访问百度首页first_url='http://www.baidu.com'print\"nowaccess%s\"%(first_url)browser.get(first_url)time.sleep(2)#访问新闻页面second_url='http://news.baidu.com'print\"nowaccess%s\"%(second_url)browser.get(second_url)time.sleep(2)#返回(后退)到百度首页print\"backtobrowser.back()time.sleep(1)%s\"%(first_url)#前进到新闻页print\"forwardtobrowser.forward()time.sleep(2)%s\"%(second_url)browser.quit()为了使过程让你看得更清晰,在每一步操作上都加了print和sleep。

说实话,这两个功能平时不太常用,所能想到的场景就是几个页面来回跳转,但又不想用geturl的情况下。

21http://fnng.cnblogs.com博客园—虫师八、操作测试对象

前面讲到了不少知识都是定位元素,定位只是第一步,定位之后需要对这个原素进行操作。鼠标点击呢还是键盘输入,这要取决于我们定位的是按钮还输入框。一般来说,webdriver中比较常用的操作对象的方法有下面几个



click点击对象

send_keys在对象上模拟按键输入

clear清除对象的内容,如果可以的话submit清除对象的内容,如果可以的话

在我们本系列开篇的第一个例子里就用到了到click和send_skys,别翻回去找了,我再贴一下代码:

coding=utf-8fromseleniumimportwebdriverimporttimedriver=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()send_keys(\"XX\")用于在一个输入框里输入内容。

22http://fnng.cnblogs.com博客园—虫师click()用于点击一个按钮。

clear()用于清除输入框的内容,比如百度输入框里默认有个“请输入关键字”的信息,再比如我们的登陆框一般默认会有“账号”“密码”这样的默认信息。clear可以帮助我们清除这些信息。

submit提交表单

我们把“百度一下”的操作从click换成submit:

#coding=utf-8fromseleniumimportwebdriverimporttimedriver=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()九、键盘事件

23http://fnng.cnblogs.com博客园—虫师本章重点:

键盘按键用法键盘组合键用法

send_keys()输入中文运行报错问题

9.1、键盘按键用法

#coding=utf-8fromseleniumimportwebdriverfromselenium.webdriver.common.keysimportKeysimportos,time#需要引入keys包driver=webdriver.Firefox()driver.get(\"http://passport.kuaibo.com/login/?referrer=http%3A%2F%2Fwebcloud.kuaibo.com%2F\")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)'''24http://fnng.cnblogs.com博客园—虫师#也可定位登陆按钮,通过enter(回车)代替click()driver.find_element_by_id(\"login\").send_keys(Keys.ENTER)'''time.sleep(3)time.sleep(3)driver.quit()要想调用键盘按键操作需要引入keys包:

fromselenium.webdriver.common.keysimportKeys通过send_keys()调用按键:send_keys(Keys.TAB)send_keys(Keys.ENTER)

#TAB#回车

注意:这个操作和页面元素的遍历顺序有关,假如当前定位在账号输入框,按键盘的tab键后遍历的不是密码框,那就不法输入密码。假如输入密码后,还有需要填写验证码,那么回车也起不到登陆的效果。

9.1、键盘组合键用法

#coding=utf-8fromseleniumimportwebdriverfromselenium.webdriver.common.keysimportKeysimportos,timedriver=webdriver.Firefox()driver.get(\"http://www.baidu.com\")25http://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()上面的操作没有实际意义,但向我们演示了键盘组合按键的用法。

十、鼠标事件

本章重点:ActionChains类

context_click()double_click()drag_and_drop()

右击双击拖动

26http://fnng.cnblogs.com博客园—虫师测试的产品中有一个操作是右键点击文件列表会弹出一个快捷菜单,可以方便的选择快捷菜单中的选择对文件进行操作(删除、移动、重命名),之前学习元素的点击非常简单:

driver.find_element_by_id(“xxx”).click()

那么鼠标的双击、右击、拖动等是否也是这样的写法呢?例如右击:driver.find_element_by_id(“xxx”).context_click()经过运行脚本得到了下面的错误提示:

AttributeError:'WebElement'objecthasnoattribute'context_click'提示右点方法不属于webelement对象,通过查找文档,发现属于ActionChains类,但文档中没有具体写法。这里要感谢北京-QC-rabbit的指点,其实整个python+selenium学习过程都要感谢北京-QC-rabbit的指点。

10.1、鼠标右键

下面介绍鼠标右键的用法,以快播私有云为例:

#coding=utf-8fromseleniumimportwebdriverfromselenium.webdriver.common.action_chainsimportActionChainsimporttimedriver=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)27http://fnng.cnblogs.com博客园—虫师#定位到要右击的元素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()'''#你也可以使用三行的写法,但我觉得上面两行写法更容易理解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()28http://fnng.cnblogs.com博客园—虫师10.3、鼠标拖放

鼠标拖放操作的写法:

#定位元素的原位置element=driver.find_element_by_name(\"source\")#定位元素要移动到的目标位置target=driver.find_element_by_name(\"target\")#执行元素的移动操作ActionChains(driver).drag_and_drop(element,target).perform()十一、定位一组元素

webdriver可以很方便的使用findElement方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,这时候就需要使用findElements方法。

定位一组对象一般用于以下场景:



批量操作对象,比如将页面上所有的checkbox都勾上

先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。比如定位出页面上所有的checkbox,然后选择最后一个

checkbox.html

Checkbox29http://fnng.cnblogs.comtype=\"text/javascript\"async=\"\"src=\"https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js\">博客园—虫师

checkbox

checkbox1
checkbox2
checkbox3radioradio30http://fnng.cnblogs.com博客园—虫师将这段代码保存复制到记事本中,将保存成checkbox.html文件。(注意,这个页面需要和我们的自动化脚本放在同一个目录下)

11.1、第一种定位方法

通过浏览器打个这个页面我们看到三个复选框和两个单选框。下面我们就来定位这三个复选框。

#-*-coding:utf-8-*-fromseleniumimportwebdriverimporttimeimportosdr=webdriver.Firefox()file_path='file:///'+os.path.abspath('checkbox.html')dr.get(file_path)#选择页面上所有的input,然后从中过滤出所有的checkbox并勾选之inputs=dr.find_elements_by_tag_name('input')forinputininputs:ifinput.get_attribute('type')=='checkbox':input.click()time.sleep(2)dr.quit()11.2、第二种定位方法

第二种写法与第一种写法差别不大,都是通过一个循环来勾选控件。

31http://fnng.cnblogs.com博客园—虫师#-*-coding:utf-8-*-fromseleniumimportwebdriverimporttimeimportosdr=webdriver.Firefox()file_path='file:///'+os.path.abspath('checkbox.html')dr.get(file_path)#选择所有的checkbox并全部勾上checkboxes=dr.find_elements_by_css_selector('input[type=checkbox]')forcheckboxincheckboxes:checkbox.click()time.sleep(2)#打印当前页面上有多少个checkboxprintlen(dr.find_elements_by_css_selector('input[type=checkbox]'))time.sleep(2)dr.quit()11.3、去掉最后一个勾选

还有一个问题,有时候我们并不想勾选页面的所有的复选框(checkbox),可以通过下面办法把最后一个被勾选的框去掉。如下:

#-*-coding:utf-8-*-fromseleniumimportwebdriverimporttime32http://fnng.cnblogs.com博客园—虫师importosdr=webdriver.Firefox()file_path='file:///'+os.path.abspath('checkbox.html')dr.get(file_path)#选择所有的checkbox并全部勾上checkboxes=dr.find_elements_by_css_selector('input[type=checkbox]')forcheckboxincheckboxes:checkbox.click()time.sleep(2)#把页面上最后1个checkbox的勾给去掉dr.find_elements_by_css_selector('input[type=checkbox]').pop().click()time.sleep(2)dr.quit()其实,去掉勾选表也逻辑也非常简单,就是再次点击勾选的按钮。可能我们比较迷惑的是如何找到“最后一个”按钮。pop()可以实现这个功能。

十二、多层框架/窗口定位

本节知识点:

多层框架或窗口的定位:

switch_to_frame()switch_to_window()

对于一个现代的web应用,经常会出现框架(frame)或窗口(window)的应用,这也就给我们的定位带来了一个难题。

有时候我们定位一个元素,定位器没有问题,但一直定位不了,这时候就要检查这个元素是否在一个frame中,seelniumwebdriver提供了一个switch_to_frame方

33http://fnng.cnblogs.com博客园—虫师法,可以很轻松的来解决这个问题。

12.1、多层框架定位

frame.html

frame$(document).ready(function(){});

frame

inner.html34http://fnng.cnblogs.com博客园—虫师inner

inner

clickframe.html中嵌套inner.html,两个文件和我们的脚本文件放同一个目录下。

下面通过switch_to_frame()方法来进行定位:#coding=utf-8fromseleniumimportwebdriverimporttimeimportosbrowser=webdriver.Firefox()file_path='file:///'+os.path.abspath('frame.html')browser.get(file_path)browser.implicitly_wait(30)#先找到到ifrome1(id=f1)browser.switch_to_frame(\"f1\")#再找到其下面的ifrome2(id=f2)browser.switch_to_frame(\"f2\")#下面就可以正常的操作元素了35http://fnng.cnblogs.com博客园—虫师browser.find_element_by_id(\"kw\").send_keys(\"selenium\")browser.find_element_by_id(\"su\").click()time.sleep(3)browser.quit()12.1、多层窗口定位

有可能嵌套的不是框架,而是窗口,还有真对窗口的方法:switch_to_window用法与switch_to_frame相同:

driver.switch_to_window(\"windowName\")

十三、层级定位

假如两个控件,他们长的一模样,还都叫“张三”,唯一的不同是一个在北京,一个在上海,那我们就可以通过,他们的城市,区,街道,来找到他们。

在实际的测试中也经常会遇到这种问题:页面上有很多个属性基本相同的元素,现在需要具体定位到其中的一个。由于属性基本相当,所以在定位的时候会有些麻烦,这时候就需要用到层级定位。先定位父元素,然后再通过父元素定位子孙元素。

level_locate.htmlLevel<p>Locate36http://fnng.cnblogs.com博客园—虫师

Level

locate

href=\"#\">Link1
  • Action
  • Another

    here

  • Somethingelse

  • tabindex=\"-1\"linkhref=\"#\">Link2Separated

    data-toggle=\"dropdown\"role=\"menu\"class=\"dropdown-menu\"

  • Action
  • Another

    here

  • Somethingelse

  • tabindex=\"-1\"linkhref=\"#\">Separated

    37http://fnng.cnblogs.com博客园—虫师上面的html代码比较乱,请复制到编辑器中查看,如nodepad++编辑器。(注意,这个页面需要和我们的自动化脚本放在同一个目录下)通过浏览器打开:

    定位思路:

    具体思路是:先点击显示出1个下拉菜单,然后再定位到该下拉菜单所在的ul,再定位这个ul下的某个具体的link。在这里,我们定位第1个下拉菜单中的Action这个选项。

    脚本如下:#-*-coding:utf-8-*-fromseleniumimportwebdriverfromselenium.webdriver.support.uiimportWebDriverWaitimporttimeimportosdr=webdriver.Firefox()file_path='file:///'+os.path.abspath('level_locate.html')dr.get(file_path)#点击Link1链接(弹出下拉列表)38http://fnng.cnblogs.com博客园—虫师dr.find_element_by_link_text('Link1').click()#找到id为dropdown1的父元素WebDriverWait(dr,10).until(lambdathe_driver.find_element_by_id('dropdown1').is_displayed())#在父亲元件下找到link为Action的子元素menu=dr.find_element_by_id('dropdown1').find_element_by_link_text('Action')the_driver:#鼠标定位到子元素上webdriver.ActionChains(dr).move_to_element(menu).perform()time.sleep(2)dr.quit()WebDriverWait(dr,10)

    10秒内每隔500毫秒扫描1次页面变化,当出现指定的元素后结束。dr就不解释了,前面操作webdriver.firefox()的句柄

    is_displayed()该元素是否用户可以见

    classActionChains(driver)driver:执行用户操作实例webdriver

    生成用户的行为。所有的行动都存储在actionchains对象。通过perform()存储的行为。

    move_to_element(menu)

    移动鼠标到一个元素中,menu上面已经定义了他所指向的哪一个元素to_element:元件移动到

    39http://fnng.cnblogs.com博客园—虫师perform()

    执行所有存储的行为

    十四、上传文件操作

    文件上传操作也比较常见功能之一,上传功能没有用到新有方法或函数,关键是思路。

    上传过程一般要打开一个本地窗口,从窗口选择本地文件添加。所以,一般会卡在如何操作本地窗口添加上传文件。

    其实,在seleniumwebdriver没我们想的那么复杂;只要定位上传按钮,通send_keys添加本地文件路径就可以了。绝对路径和相对路径都可以,关键是上传的文件存在。下面通地例子演示。

    14.1、操作文件上传例子

    upload_file.html

    upload_file

    upload_file

    40http://fnng.cnblogs.com博客园—虫师操作上传脚本:#coding=utf-8fromseleniumimportwebdriverimportos,timedriver=webdriver.Firefox()#脚本要与upload_file.html同一目录file_path='file:///'+os.path.abspath('upload_file.html')driver.get(file_path)#定位上传按钮,添加本地文件driver.find_element_by_name(\"file\").send_keys('D:\\\\selenium_use_case\d_file.txt')time.sleep(2)driver.quit()14.2、139邮箱上传

    其它有些应用不好找,所以就自己创建页面,这样虽然麻烦,但脚本代码突出重点。这里找一139邮箱的实例,有帐号的同学可以测试一下~!(登陆基础版的139邮箱,网盘模块上传文件。)#coding=utf-8fromseleniumimportwebdriver41http://fnng.cnblogs.com博客园—虫师importos,timedriver=webdriver.Firefox()driver.get(\"http://m.mail.10086.cn\")driver.implicitly_wait(30)#登陆driver.find_element_by_id(\"ur\").send_keys(\"手机号\")driver.find_element_by_id(\"pw\").send_keys(\"密码\")driver.find_element_by_class_name(\"loading_btn\").click()time.sleep(3)#进入139网盘模块driver.find_element_by_xpath(\"/html/body/div[3]/a[9]/span[2]\").click()time.sleep(3)#上传文件driver.find_element_by_id(\"id_file\").send_keys('D:\\\\selenium_use_case\d_file.txt')time.sleep(5)driver.quit()十五、下拉框处理

    本节重点处理下拉框switch_to_alert()accept()下拉框是我们最常见的一种页面元素,对于一般的元素,我们只需要一次就定位,但下拉框里的内容42http://fnng.cnblogs.com博客园—虫师需要进行两次定位,先定位到下拉框,再定位到下拉框内里的选项。15.1、操作下拉框例子

    drop_down.htmlUPSNextDayAir==>$12.51UPSNextDayAirSaver==>$11.61UPS3DaySelect==>$10.69UPS2ndDayAir==>$9.03UPSGround==>$8.34USPSPriorityMailInsured==>$9.25USPSPriorityMail==>$7.45USPSFirstClass==>$3.20保存并通过浏览器打开,如下:现在我们来通过脚本选择下拉列表里的$10.69

    #-*-coding=utf-8fromseleniumimportwebdriverimportos,timedriver=webdriver.Firefox()43http://fnng.cnblogs.com博客园—虫师file_path='file:///'+os.path.abspath('drop_down.html')driver.get(file_path)time.sleep(2)#先定位到下拉框m=driver.find_element_by_id(\"ShippingMethod\")#再点击下拉框下的选项m.find_element_by_xpath(\"//option[@value='10.69']\").click()time.sleep(3)driver.quit()解析:

    这里可能和之前的操作有所不同,首先要定位到下拉框的元素,然后选择下拉列表中的选项进行点击操作。

    m=driver.find_element_by_id(\"ShippingMethod\")

    m.find_element_by_xpath(\"//option[@value='10.69']\").click()

    15.2、百度搜索设置下拉框操作

    #-*-coding=utf-8fromseleniumimportwebdriverimportos,timedriver=webdriver.Firefox()driver.get(\"http://www.baidu.com\")#进入搜索设置页driver.find_element_by_link_text(\"搜索设置\").click()#设置每页搜索结果为100条m=driver.find_element_by_name(\"NR\")44http://fnng.cnblogs.com博客园—虫师m.find_element_by_xpath(\"//option[@value='100']\").click()time.sleep(2)#保存设置的信息driver.find_element_by_xpath(\"//input[@value='保存设置']\").click()time.sleep(2)driver.switch_to_alert().accept()#跳转到百度首页后,进行搜索表(一页应该显示100条结果)driver.find_element_by_id(\"kw\").send_keys(\"selenium\")driver.find_element_by_id(\"su\").click()time.sleep(3)driver.quit()解析:当我们在保存百度的设置时会会弹出一个确定按钮;我们并没按照常规的方法去定位弹窗上的“确定”按钮,而是使用:driver.switch_to_alert().accept()

    完成了操作,这是因为弹窗比较是一个具有唯一性的警告信息,所以可以用这种简便的方法处理。

    –switch_to_alert()

    焦点集中到页面上的一个警告(提示)–accept()接受警告提示

    十六、调用js

    本节重点:

    45http://fnng.cnblogs.com博客园—虫师调用js方法

    execute_script(script,*args)

    在当前窗口/框架同步执行javaScriptscript:JavaScript的执行。*args:适用任何JavaScript脚本。使用:

    driver.execute_script(‘document.title’)

    15.1、通过js隐藏元素

    js.htmljs$(document).ready(function(){type=\"text/javascript\"async=\"\"src=\"http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js\">

    js

    hovertoseetooltipButton46http://fnng.cnblogs.com博客园—虫师(保持html文件与执行脚本在同一目录下)

    执行js一般有两种场景:

    一种是在页面上直接执行JS

    另一种是在某个已经定位的元素上执行JS

    #coding=utf-8fromseleniumimportwebdriverimporttime,osdriver=webdriver.Firefox()file_path='file:///'+os.path.abspath('js.html')driver.get(file_path)#######通过JS隐藏选中的元素##########第一种方法:driver.execute_script('$(\"#tooltip\").fadeOut();')time.sleep(5)#第二种方法:button=driver.find_element_by_class_name('btn')driver.execute_script('$(arguments[0]).fadeOut()',button)time.sleep(5)driver.quit()47http://fnng.cnblogs.com博客园—虫师15.2、通过js使输入框标红

    #coding=utf-8fromseleniumimportwebdriverimporttimedriver=webdriver.Firefox()driver.get(\"http://passport.kuaibo.com/login/?referrer=http%3A%2F%2Fvod.kuaibo.com%2F%3Ft%3Dhome\")#给用户名的输入框标红js=\"varred\\\";\"#调用jsdriver.execute_script(js)time.sleep(3)q=document.getElementById(\\\"user_name\\\");q.style.border=\\\"1pxsoliddriver.find_element_by_id(\"user_name\").send_keys(\"username\")driver.find_element_by_id(\"user_pwd\").send_keys(\"password\")driver.find_element_by_id(\"dl_an_submit\").click()time.sleep(3)driver.quit()js解释:

    q=document.getElementById(\\\"user_name\\\")元素q的id为user_name

    q.style.border=\\\"1pxsolidred\\元素q的样式,边框为1个像素红色

    48http://fnng.cnblogs.com博客园—虫师十六、控制浏览器滚动条

    有时候我们需要控制页面滚动条上的滚动条,但滚动条并非页面上的元素,这个时候就需要借助js是来进行操作。一般用到操作滚动条的会两个场景:

    注册时的法律条文需要阅读,判断用户是否阅读的标准是:滚动条是否拉到最下方。要操作的页面元素不在吸视范围,无法进行操作,需要拖动滚动条

    其实,实现这个功能只要一行代码,但由于不懂js,所以花了不小力气找到这种方法。

    用于标识滚动条位置的代码

    onload=\"document.body.scrollTop=100000\">如果滚动条在最上方的话,scrollTop=0,那么要想使用滚动条在最可下方,可以scrollTop=100000,这样就可以使滚动条在最下方。16.1、场景一

    先来解决场第一个问题,法律条款是一个内嵌窗口,通过firebug工具可以定位到内嵌入窗口可以定位到元素的id,可以通过下面的代码实现。js=\"varq=document.getElementById('id').scrollTop=10000\"driver.execute_script(js)16.1、场景二

    有滚动条的页面到处可见,这个就比较容易找例子,我们以操作百度搜索结果页为例:#coding=utf-8fromseleniumimportwebdriverimporttime49http://fnng.cnblogs.com博客园—虫师#访问百度driver=webdriver.Firefox()driver.get(\"http://www.baidu.com\")#搜索driver.find_element_by_id(\"kw\").send_keys(\"selenium\")driver.find_element_by_id(\"su\").click()time.sleep(3)#将页面滚动条拖到底部js=\"varq=document.documentElement.scrollTop=10000\"driver.execute_script(js)time.sleep(3)#将滚动条移动到页面的顶部js=\"varq=document.documentElement.scrollTop=0\"driver.execute_script(js)time.sleep(3)driver.quit()十七、webdriver原理解析

    之前看乙醇视频中提到,selenium的ruby实现有一个小后门,在代码中加上$DEBUG=1,再运行脚本的过程中,就可以看到客户端请求的信息与服务器端返回的数据;觉得这个功能很强大,可以帮助理解webdriver的运行原理。

    后来查了半天,python并没有提供这样一个方便的后门,不过我们可以通过代理的方式获得这些交互信息;

    一、需要安装java虚拟机与selenium-server-standalone,参考本文档第一章环境搭建第7、8步操作:

    二、通过下面命令启动服务:

    50http://fnng.cnblogs.com博客园—虫师C:\\selenium>java-jarselenium-server-standalone-2.33.0.jar在命令结尾加>d:\\log.txt可以将命令信息存入文件,但信息很少。

    运行下面的自动化脚本:

    #coding=utf-8importtimefromseleniumimportwebdriverfromselenium.webdriver.common.desired_capabilitiesimportDesiredCapabilitiesdriver=webdriver.Remote(desired_capabilities=DesiredCapabilities.CHROME)driver.get(\"http://www.youdao.com\")driver.find_element_by_name(\"q\").send_keys(\"hello\")driver.find_element_by_name(\"q\").send_keys(\"key.ENTER\")driver.close()webdriver原理:1.WebDriver启动目标浏览器,并绑定到指定端口。该启动的浏览器实例,做为webdriver的remoteserver。2.Client端通过CommandExcuter发送HTTPRequest给remoteserver的侦听端口(通信协议:thewebriverwireprotocol)3.Remoteserver需要依赖原生的浏览器组件(如:IEDriver.dll,chromedriver.exe),来转化转化浏览器的native调用。查看命令提示符下的运行日志:咋一看很乱,慢慢分析一下就发现很有意思!结合上面的脚本分析------------------------------------------------------------------------启动代理进入监听状态C:\\selenium>java-jarselenium-server-standalone-2.33.0.jar八月22,201310:19:48上午org.openqa.grid.selenium.GridLaunchermainINFO:Launchingastandaloneserver10:19:48.734INFO-Java:OracleCorporation23.21-b0151http://fnng.cnblogs.com博客园—虫师10:19:48.734INFO-OS:WindowsXP5.1x8610:19:48.734INFO-v2.33.0,withCorev2.33.0.Builtfromrevision4e90c9710:19:48.843INFO-RemoteWebDriverinstancesshouldconnectto:http://127.0.0.1:4444/wd/hub10:19:48.843INFO-VersionJetty/5.1.x10:19:48.843INFO-StartedHttpContext[/selenium-server/driver,/selenium-server/driver]10:19:48.843INFO-StartedHttpContext[/selenium-server,/selenium-server]10:19:48.843INFO-StartedHttpContext[/,/]10:19:48.890INFO-Startedorg.openqa.jetty.jetty.servlet.ServletHandler@176343e10:19:48.890INFO-StartedHttpContext[/wd,/wd]10:19:48.906INFO-StartedSocketListeneron0.0.0.0:444410:19:48.906INFO-Startedorg.openqa.jetty.jetty.Server@388c74--------------------------------------------------------------------------------------创建新session10:20:38.593INFO-Executing:[newsession:{platform=ANY,javascriptEnabled=true,browserName=chrome,version=}]atURL:/session)10:20:38.593INFO-CreatinganewsessionforCapabilities[{platform=ANY,javascriptEnabled=true,browserName=chrome,version=}]webdrivr通过GET方式发送请求[0.921][INFO]:receivedWebriverrequest:GET/status向webdrver返回响应,返回码200表示成功[0.921][INFO]:sendingWebriverresponse:200{\"sessionId\":\"\",\"status\":0,\"value\":{\"build\":{\"version\":\"alpha\"\"os\":{\"arch\":\"x86\",\"name\":\"WindowsNT\",\"version\":\"5.1SP3\"}}}},52http://fnng.cnblogs.com博客园—虫师webdriver再次以POST方式发送请求,并启动浏览器相关信息[0.984][INFO]:receivedWebriverrequest:POST/session{\"desiredCapabilities\":{\"browserName\":\"chrome\",\"javascriptEnabled\":true,\"platform\":\"ANY\",\"version\":\"\"}[0.984][INFO]:Launchingchrome:\"C:\\ocumentsandSettings\\Administrator\\LocalSettings\\Applicationata\\Google\\Chrome\\Application\\chrome.exe\"--remote-debugging-port=4223--no-first-run--enable-logging--logging-level=1--user-data-dir=\"C:\\OCUME~1\\AMINI~1\\LOCALS~1\\Temp\\scoped_dir1808_7550\"--load-extension=\"C:\\OCUME~1\\AMINI~1\\LOCALS~1\\Temp\\scoped_dir1808_26821\\internal\"--ignore-certificate-errorsdata:text/html;charset=utf-8,[1.773][INFO]:sendingWebriverresponse:303webdriver再次以GET方法请求,这附加上了session的信息[1.778][INFO]:receivedWebriverrequest:GET/session/32b33aa585ccbbf7ba78535882852af3服务器先对sesssionID进行解析,确认是selenium调用的以及要访问的网址,[1.779][INFO]:sendingWebriverresponse:200{\"sessionId\":\"32b33aa585ccbbf7ba78535882852af3\",\"status\":0,\"value\":{\"acceptSslCerts\":true,\"applicationCacheEnabled\":false,\"browserConnectionEnabled\":false,\"browserName\":\"chrome\",\"chrome\":{\"chromedriverVersion\":\"2.0\"\"cssSelectorsEnabled\":true,\"databaseEnabled\":true,\"handlesAlerts\":true,\"javascriptEnabled\":true,\"locationContextEnabled\":true,},}53http://fnng.cnblogs.com博客园—虫师\"nativeEvents\":true,\"platform\":\"WindowsNT\",\"rotatable\":false,\"takesScreenshot\":true,\"version\":\"27.0.1453.116\",\"webStorageEnabled\":true}10:20:40.640INFO-Done:/session10:20:40.640INFO-Executing:org.openqa.selenium.remote.server.handler.GetSessionCapabilities@14cf7a1atURL:/session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc)10:20:40.640INFO-Done:/session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc10:20:40.656INFO-Executing:[get:http://www.youdao.com]atURL:/session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc/url)webdriver正试向服务器请求youdao网站[1.820][INFO]:receivedWebriverrequest:POST/session/32b33aa585ccbbf7ba78535882852af3/url{\"url\":\"http://www.youdao.com\"}[1.822][INFO]:waitingforpendingnavigations...[1.829][INFO]:donewaitingforpendingnavigations[2.073][INFO]:waitingforpendingnavigations...[2.900][INFO]:donewaitingforpendingnavigations获得服务器数据的应答[2.900][INFO]:sendingWebriverresponse:200{\"sessionId\":\"32b33aa585ccbbf7ba78535882852af3\",\"status\":0,\"value\":null}10:20:41.734INFO-Done:/session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc/url--------------------------------------------------------------下面接着发送定位输入框的信息10:20:41.734INFO-Executing:[findelement:By.name:q]atURL:/session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc/element)[2.905][INFO]:receivedWebriverrequest:POST/session/32b33aa585ccbbf7ba78535882852af3/element{\"using\":\"name\",\"value\":\"q\"}}54http://fnng.cnblogs.com博客园—虫师[2.905][INFO]:waitingforpendingnavigations...[2.905][INFO]:donewaitingforpendingnavigations[2.922][INFO]:waitingforpendingnavigations...[2.922][INFO]:donewaitingforpendingnavigations得到服务器应答[2.922][INFO]:sendingWebriverresponse:200{\"sessionId\":\"32b33aa585ccbbf7ba78535882852af3\",\"status\":0,\"value\":{\"ELEMENT\":\"0.19427558477036655:1\"}10:20:41.765INFO-Done:/session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc/element10:20:41.765INFO-Executing:[sendkeys:0org.openqa.selenium.support.events.EventFiringWebDriver$EventFiringWebElement@a8215ba9,[h,e,l,l,o]]atURL:/session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc/element/0/value)向定位到的输入框写入hello[2.936][INFO]:receivedWebriverrequest:POST/session/32b33aa585ccbbf7ba78535882852af3/element/0.19427558477036655:1/value{\"id\":\"0.19427558477036655:1\",\"value\":[\"h\",\"e\",\"l\",\"l\",\"o\"]}[2.936][INFO]:waitingforpendingnavigations...[2.936][INFO]:donewaitingforpendingnavigations[3.002][INFO]:waitingforpendingnavigations...[3.002][INFO]:donewaitingforpendingnavigations[3.002][INFO]:sendingWebriverresponse:200{\"sessionId\":\"32b33aa585ccbbf7ba78535882852af3\",\"status\":0,\"value\":null}10:20:41.843INFO-Done:/session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc/element/0/value再次发送定位输入框的请求10:20:41.843INFO-Executing:[findelement:By.name:q]atURL:/session/ac5b2}55http://fnng.cnblogs.com博客园—虫师c71-5b1a-469e-814c-fdd09a2061fc/element)[3.006][INFO]:receivedWebriverrequest:POST/session/32b33aa585ccbbf7ba78535882852af3/element{\"using\":\"name\",\"value\":\"q\"}[3.006][INFO]:waitingforpendingnavigations...[3.006][INFO]:donewaitingforpendingnavigations[3.016][INFO]:waitingforpendingnavigations...[3.016][INFO]:donewaitingforpendingnavigations[3.016][INFO]:sendingWebriverresponse:200{\"sessionId\":\"32b33aa585ccbbf7ba78535882852af3\",\"status\":0,\"value\":{\"ELEMENT\":\"0.19427558477036655:1\"}10:20:41.859INFO-Done:/session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc/element10:20:41.859INFO-Executing:[sendkeys:0org.openqa.selenium.support.events.EventFiringWebDriver$EventFiringWebElement@a8215ba9,[k,e,y,.,E,N,T,E,R]]atURL:/session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc/element/0/value)}对定位的到的输入框发送回车(ENTER)事件请求[3.021][INFO]:receivedWebriverrequest:POST/session/32b33aa585ccbbf7ba78535882852af3/element/0.19427558477036655:1/value{\"id\":\"0.19427558477036655:1\",\"value\":[\"k\",\"e\",\"y\",\".\",\"E\",\"N\",\"T\",\"E\",\"R\"]}[3.021][INFO]:waitingforpendingnavigations...[3.021][INFO]:donewaitingforpendingnavigations[3.064][INFO]:waitingforpendingnavigations...[3.064][INFO]:donewaitingforpendingnavigations[3.064][INFO]:sendingWebriverresponse:200{\"sessionId\":\"32b33aa585ccbbf7ba78535882852af3\",\"status\":0,\"value\":null}10:20:41.906INFO-Done:/session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc/element/56http://fnng.cnblogs.com博客园—虫师0/value10:20:41.906INFO-Executing:[close/session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc/window)window]atURL:[3.068][INFO]:receivedWebriverrequest:ELETE/session/32b33aa585ccbbf7ba78535882852af3/window[WARNING:chrome_desktop_impl.cc(88)]chromedetaches,usershouldtakecareofdirectory:C:\\DOCUME~1\\ADMINI~1\\LOCALS~1\\Temp\\scoped_dir1808_7550andC:\\DOCUME~1\\ADMINI~1\\LOCALS~1\\Temp\\scoped_dir1808_26821[5.318][INFO]:sendingWebriverresponse:200{\"sessionId\":\"32b33aa585ccbbf7ba78535882852af3\",\"status\":0,\"value\":null}10:20:44.156INFO-Done:/session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc/window扩展资料:rtsmeyiselenium与webdriver的关系:http://v.qq.com/boke/page/j/v/v/j01135krrvv.htmllazyman快速入门:http://v.qq.com/boke/page/i/k/a/i0113wompka.html关于python自动化的博客,慢慢研读:http://www.cnblogs.com/hzhida/archive/2012/08/13/2637089.htmlsplinter自动化框架:http://splinter.cobrateam.info/docs/why.htmlhttp://v.qq.com/boke/page/s/8/3/s0114uu1d83.html。大家可以了解一下webdriverguide的内容webdriverAPI地址:

    https://github.com/easonhan007/webdriver_guiderobotframework57http://fnng.cnblogs.com自动化测试框架,后序研究。RF框架系列文章http://www.51testing.com/?21116/http://blog.csdn.net/tulituqi/article/category/897484/2安装:http://blog.sina.com.cn/s/blog_654c6ec70100tkxn.htmlseleniumwebdriverpy文档http://selenium.googlecode.com/git/docs/api/py/index.htmlseleniumwrapper0.5.3

    https://pypi.python.org/pypi/seleniumwrapperseleniumwebdriver系列教程http://blog.csdn.net/nbkhic/article/details/6896889文档http://selenium.googlecode.com/git/docs/api/py/index.html58博客园—虫师http://fnng.cnblogs.com

    因篇幅问题不能全部显示,请点此查看更多更全内容