selenium_webdriver(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命名时一般使其有意义也会取不同的名字。通过这两个属性使我们找一个页面上的属性变得相当容易
我们通过前端工具,找到了百度输入框的属性信息,如下:
通过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属性 什么是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.htmlcheckbox