实 验 简 介
到目前为止,我们的实验均进行的是常规的操作,比如鼠标的单击操作,或者通过SendKeys输入一段文本。但是在一个Web页面中,远远不止这样的简单操作,比如我们需要操作到鼠标的右键,双击操作,鼠标在某个元素上悬停,鼠标拖动,或者在键盘上操作组合键等。本节实验将为大家详细介绍鼠标和键盘的特殊操作的各类用法。
实 验 目 的
(1) 掌握在Selenium中的常用的鼠标操作。
(2) 掌握在Selenium中的常用的键盘操作。
实 验 流 程
1.ActionChains对象介绍
在Selenium WebDriver中,在浏览器窗口中的所有鼠标和键盘的模拟使用的都是ActionChains这个对象。该对象在实例化时与WebDriver对象进行关联,从而在针对当前WebDriver所操作的浏览器窗口中生效。主要的操作方法如下:
(1)鼠标基本操作:单击:click,双击:double_click,右键:context_click。
(2)鼠标的定位与悬停:移动到某个元素上:move_to_element,在某个元素上悬停:click_and_hold。
(3)鼠标的拖动:将一个元素拖到到另外一个元素上:drag_and_drop,但是该功能在新版本的WebDriver上并不能很好地工作,还未修复此Bug,所以我们需要使用其它解决方案。
(4)鼠标的所事件,必须使用perform() 执行所有ActionChains 中存储的行为,也就是必须使用此方法来实现鼠标对元素的操作。
2.ActionChains对象使用
(1)右键点击事件,使用context_click()方法。
一般来说,在web端点击一个链接的时候,当前页面会直接跳转到另外一个新的页面上去。但是,有时候需要在新标签内打开页面,保留当前页面,webdriver的click()方法就就无法满足要求了。比如在蜗牛进销存中想要一次打开很多个模块,而不是在不同的模块间跳转。怎么实现呢?如图5-33所示。
在前面鼠标事件介绍里面可以看到ActionChains对象下有context_click()右键点击的方法。那么在使用webdriver的时候,可以引入右键点击,打开“在新标签中打开”的选项,如图所示。
实现代码如下:
from selenium import webdriver …#登录蜗牛进销存过程省略 #登录完成后执行下面代码 goods_in=driver.find_element_by_link_text('商品入库') #定位元素 #右键点击该元素 webdriver.ActionChains(driver).context_click(goods_in).perform() |
上面代码执行后可以看到,在当前元素上执行了鼠标右键点击事件。打开了右键选项。要选择新标签打开选项,还需要使用键盘事件,后面将会讲到。
(2)双击事件,double_click()方法的使用。
在页面中很少会用到双击才能事件的点击事件。但鼠标事件ActionChains对象提供了这个方法,我们自己可以写一个web页面来实现一个双击的按钮。代码如下:
<html> <head> </head> <body> <input id=”click” type="button" value="单击" onClick="alert('你单击了我!')"> <input id=”doubleclick” type="button" value="双击" onDblClick="alert('你双击了我')"> </body> </html> |
用浏览器打开,获得页面如图所示。
用webdriver代码实现单击和双击操作,代码如下:
from selenium import webdriver driver = webdriver.Firefox(firefox_binary=r"C:\Program Files (x86)\Mozilla Firefox\firefox.exe") # driver.find_element_by_id('click').click() #单击没问题 ele = driver.find_element_by_id('doubleclick') webdriver.ActionChains(driver).double_click(ele).perform() |
(3)移动、悬停事件move_to()方法的使用。
在某些web端页面上,会出现一些下拉列表,需要鼠标移动到上面悬停时,才可以展开列表选项,如果使用webdriver直接定位页面下拉列表的展开项,程序在超时时间后会直接抛出元素找不到的异常。如图所示。
想要实现点击高级搜索,可以在使用click()点击设置后在定位“高级搜索”,或者使用鼠标事件,将鼠标移动到“设置”上,当展开列表后再选择“高级搜索”,代码如下:
from selenium import webdriver driver = webdriver.Firefox(firefox_binary=r"C:\Program Files (x86)\Mozilla Firefox\firefox.exe") ele = driver.find_element_by_link_text('设置') |
(4)拖动事件,drag_and_drop()方法的使用。
此方法在webdriver的鼠标事件中,本身设计的意图是可以实现,鼠标点击一个页面元素并把其拖放到某个页面位置上,比如想要把新闻链接的元素拖放到输入框内,如图所示。
按鼠标事件实现的方法编写代码如下:
from selenium import webdriver driver = webdriver.Firefox(firefox_binary=r"C:\Program Files (x86)\Mozilla Firefox\firefox.exe") before_move = driver.find_element_by_link_text("新闻") ActionChains(driver).drag_and_drop_by(before_move,after_move).perform() |
执行上面代码,很遗憾!大家可以发现新闻是被点击状态,但并没有任何的拖动效果。查询资料后发现,国外使用者也在反应这个问题,我们暂时可以认为这是一个BUG,webdriver的这个版本还未修复。
3.键盘事件介绍
在webdriver中,Keys类中提供了几乎所有的键盘事件,在鼠标事件中用到了两个键盘事件,键盘的向下按键(send_keys(Keys.DOWN))和键盘的回车事件(send_keys(Keys.ENTER))。键盘的事件需要导入Keys模块,代码如下:
from selenium.webdriver.common.keys import Keys |
导入模块后,只需要用send_keys()方法就可以实现模拟键盘输入了,下面看看有哪些常用的键盘输入:
Keys.BACK_SPACE:回退键(BackSpace) Keys.TAB:制表键(Tab) Keys.ENTER:回车键(Enter) Keys.SHIFT:大小写转换键(Shift) Keys.CONTROL:Control键(Ctrl) Keys.ALT:ALT键(Alt) Keys.ESCAPE:返回键(Esc) Keys.SPACE:空格键(Space) Keys.PAGE_UP:翻页键上(Page Up) Keys.PAGE_DOWN:翻页键下(Page Down) Keys.END:行尾键(End) Keys.HOME:行首键(Home) Keys.LEFT:方向键左(Left) Keys.UP:方向键上(Up) Keys.RIGHT:方向键右(Right) Keys.DOWN:方向键下(Down) Keys.INSERT:插入键(Insert) DELETE:删除键(Delete) (Keys.CONTROL, ‘a’):组合键Control+a,全选 (Keys.CONTROL, ‘c’):组合键Control+c,复制 (Keys.CONTROL, ‘x’):组合键Control+x,剪切 (Keys.CONTROL, ‘v’):组合键Control+v,粘贴 |
键盘事件举例
完成前面新标签打开页面实验,代码如下:
… from selenium.webdriver.common.keys import Keys …#登录蜗牛进销存过程省略 #登录完成后执行下面代码 goods_in=driver.find_element_by_link_text('商品入库') #定位元素 #右键点击该元素 webdriver.ActionChains(driver).context_click(goods_in).perform() goods_in.send_keys(‘T’) |
在百度尝试其他键盘输入效果,代码如下:
from selenium import webdriver from selenium.webdriver.common.keys import Keys #引入Keys 类包 import time
driver = webdriver.Firefox(firefox_binary=r"C:\Program Files (x86)\Mozilla Firefox\firefox.exe") driver.get("http://www.baidu.com")
#输入框输入内容 driver.find_element_by_id("kw").send_keys("蜗牛创想科技有限公司i") time.sleep(3) #删除多输入的一个i driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE) time.sleep(3) #输入空格键+“教程” driver.find_element_by_id("kw").send_keys(Keys.SPACE) driver.find_element_by_id("kw").send_keys(‘蜗牛学院’) 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(Keys.CONTROL,'v') time.sleep(3) #通过回车键盘来代替点击操作 driver.find_element_by_id("su").send_keys(Keys.ENTER) time.sleep(3)
|
4.补充说明
事实上,在一个Web页面中,鼠标悬停的操作通常都是为了实现一个具体的功能,或者打开一个超链接之类的。所以,如果我们单纯只是通过完整的模拟界面的操作不一定是效率最高的操作,我们也可以直接使用driver.get(“URL”)的方式打开某个超链接,甚至直接调用当前页面中的JavaScript脚本,均可以实现各类操作。
所以,在实际的GUI自动化测试中,我们可能需要结合各种不同的技术手段来完成测试开发工作,而不能过分拘泥于某一两种固定的手段。
下周分享:核心实验:Selenium WebDriver->其他应用