【Selenium专题】鼠标键盘事件

系统 1797 0

引用包来自selenium-java-2.23.1.jar

调用以下代码时,需要引入actions类,以java为例:  import org.openqa.selenium.interactions.Actions; 

 

鼠标事件-概述


1. 单击   click()、 click(WebElement onElement)

2. 双击  doubleClick() 、 doubleClick(WebElement onElement) 

3. 右击  contextClick()、 contextClick(WebElement onElement)

4. 移动/悬浮   moveByOffset(int xOffset, int yOffset)、 moveToElement(WebElement toElement)、 moveToElement(WebElement toElement, int xOffset, int yOffset)

5. 左键按下不释放   clickAndHold()、 clickAndHold(WebElement onElement)

6. 释放   release()、 release(WebElement onElement),经常与clickAndHold相配合

7. 拖动  dragAndDrop(WebElement source, WebElement target)、  dragAndDropBy(WebElement source, int xOffset, int yOffset)

  •  以上方法返回值均为Actions,  需要调用perform()后才能真正执行。

  键盘事件 -概述


1. 普通键操作 :sendKeys(java.lang.CharSequence... keysToSend)、 sendKeys(WebElement element, java.lang.CharSequence... keysToSend)

2. 修饰键操作

  按下修饰键: keyDown(Keys theKey)、 keyDown(WebElement element, Keys theKey)、 sendKeys(keysToSend)

  松开修饰键:keyUp(Keys theKey)、 keyUp(WebElement element, Keys theKey)、 sendKeys( Keys.NULL )

  •  以上方法返回值均为Actions,  需要调用perform()后才能真正执行
  • keyDown\keyUp 参数只能是修饰键,否则抛出llegalArgumentException 异常
  • 执行 keyDown (theKey)和sendKeys(修饰键)后,需要明显释放,否则将一直执行;释放方法分别为 keyUp (theKey), sendKeys(Keys.NULL)
  • 区分Actions.sendKeys(keysToSend)和   WebElement.sendKeys(CharSequence...)

执行事件


1.build():组合所有actions,生成新的actions

2.perform():执行actions,参考源码发现该方法包含build()

  • 所有Actions事件必须调用perform后才被真正执行

============================================================================================

鼠标事件-案例


 1. 单击  click()、 click(WebElement onElement)  

      Actions action = 
      
        new
      
       Actions(driver);
      
action.click().perform(); // 鼠标左键在当前停留的位置做单击操作 action.click(driver.findElement(By.***)).perform(); // 鼠标左键点击指定的元素

  2. 双击 doubleClick() 、 doubleClick(WebElement onElement) 

      Actions action = 
      
        new
      
      
         Actions(driver); 

action.doubleClick().perform();
      
      
        //
      
      
         鼠标在当前停留的位置做双击操作 
      
      

action.doubleClick(driver.findElement(By.***)).perform();
      
        //
      
      
         鼠标双击指定的元素
      
    

3. 右击 contextClick()、 contextClick(WebElement onElement)  

      Actions action = 
      
        new
      
      
         Actions(driver); 

action.contextClick().perform();
      
      
        //
      
      
         鼠标右键在当前停留的位置做单击操作 
      
      

action.contextClick(driver.findElement(By.***)).perform();
      
        //
      
      
         鼠标右键点击指定的元素
      
    

  4. 移动/悬浮  moveByOffset(int xOffset, int yOffset)、 moveToElement(WebElement toElement)、 moveToElement(WebElement toElement, int xOffset, int yOffset)

      Actions action = 
      
        new
      
      
         Actions(driver); 

action.moveToElement(toElement).perform();
      
      
        //
      
      
         将鼠标移到 toElement 元素中心点
        
action.moveToElement(toElement,xOffset,yOffset).perform(); // 将鼠标移到元素 toElement 的 (xOffset, yOffset) 位置,
// 这里的 (xOffset, yOffset) 是以元素 toElement 的左上角为 (0,0) 开始的 (x, y) 坐标轴。 action.moveByOffset(xOffset,yOffset).perform(); // 以鼠标当前位置或者 (0,0) 为中心开始移动到 (xOffset, yOffset) 坐标轴

action.moveByOffset(xOffset,yOffset) 这里需要注意,如果 xOffset为负数,表示横坐标向左移动,yOffset 为负数表示纵坐标向上移动。而且如果这两个值大于当前屏幕的大小,鼠标只能移到屏幕最边界的位置同时抛出MoveTargetOutOfBoundsExecption 的异常。

5. 左键按下不释放  clickAndHold()、 clickAndHold(WebElement onElement) 

      Actions action = 
      
        new
      
      
         Actions(driver); 

 action.clickAndHold().perform();
      
      
        //
      
      
         鼠标在当前位置点击后不释放
      
      

 action.clickAndHold(onElement).perform();
      
        //
      
      
         鼠标在 onElement 元素的位置点击后不释放
      
    

6. 释放  release()、 release(WebElement onElement),经常与clickAndHold相配合

      Actions action = 
      
        new
      
      
         Actions(driver); 

 action.release().perform();
      
      
        //
      
      
         释放鼠标
      
    

7. 拖动  dragAndDrop(WebElement source, WebElement target)、  dragAndDropBy(WebElement source, int xOffset, int yOffset)

      Actions action = new
      
         Actions(driver); 

action.dragAndDrop(source,target).perform();// 将 source 元素拖放到 target 元素的位置。

action.dragAndDrop(source,xOffset,yOffset).perform();// 将 source 元素拖放到 (xOffset, yOffset) 位置,其中 xOffset 为横坐标,yOffset 为纵坐标。
      
    

  拖拽动作是组合动作可以拆分实现:

      Actions action = new
      
         Actions(driver);

action.clickAndHold(source).moveToElement(target).release().perform(); //选中source元素->移动到target元素位置->释放左键

action.clickAndHold(source).moveByOffset(xOffset,yOffset).release().perform(); //选中source元素->拖放到(xOffset,yOffset)位置->释放左键
      
    

键盘事件-案例


  键盘的划分:

  • 普通键  
    • 已枚举:Keys.TAB、Keys.SPACE、Keys.F4、Keys.NUMPAD2、Keys.ARROW_DOWN、Keys.BACK_SPACE等;更多枚举键可参考selenium api中的keys类
    • 未枚举:的字母键(a、b、c...)和符号键(‘ {}\[]’、‘ \ ’、‘。’、‘ ? ’、‘:’、‘ + ’、‘ – ’、‘ = ’、、‘“”’)等
  • 修饰键  Keys.CONTROL、Keys.SHIFT、Keys.ALT等,单独按下修饰键本身一般不会触发任何键盘事件,通常和普通建组合使用。
  • 更多信息可参考 Modifier key

1. 普通键盘操作  

      Actions action = 
      
        new
      
      
         Actions(driver); 

 action.sendKeys(Keys.TAB).perform();
      
      
        //
      
      
         模拟按下并释放 TAB 键
      
      

 action.sendKeys(element,Keys.SPACE).perform();
      
        //
      
      
         对element输入并释放空格键--可拆分为 
      
      action.click(element).sendKeys(Keys.SPACE).perform();
      
action.sendKeys("a").perform();// 模拟输入a
action.sendKeys(",").perform();// 模拟输入,

    Actions.sendKeys(keysToSend)和  WebElement.sendKeys(CharSequence...)区别

    • Actions.sendKeys(keysToSend) ,操作修饰键时不会释放,等于actions.sendKeys(keysToSend),需要action.sendKeys(keys.NULL) 释放修饰键; WebElement.sendKeys()直接释放参数
    • 其次就是当 Actions 的 sendKeys(keysToSend) 执行完之后,焦点就不在当前元素了。所以我们可以使用 sendKeys(Keys.TAB) 来切换元素的焦点,从而达到选择元素的作用,这个最常用到的场景就是在用户名和密码的输入过程中。
    • WebElement.sendKeys(keysToSend) 可以上传附件,比如element.sendKeys(“C:\\test\\uploadfile\\test.jpg”); 这个操作将 test.jpg上传到服务器;但是使用以下方法不会报错,但是实际上传失败:
                
                  Actions action = New Actions(driver); 
      
      action.sendKeys(element,“C:\\test\\upload\\test.jpg”); 或 action.click(element).sendKeys(“C:\\test\\upload\\test.jpg”);
                
              

2. 修饰键操作:

  按下修饰键: keyDown(Keys theKey)、 keyDown(WebElement element, Keys theKey)、 sendKeys(keysToSend)

  松开修饰键:keyUp(Keys theKey)、 keyUp(WebElement element, Keys theKey)、 sendKeys( Keys.NULL )  

  1)修饰键惯用操作:

         Actions action = new Actions(driver); 

   action.keyDown(Keys.CONTROL);// 按下 Ctrl 键

   action.keyDown(Keys.SHIFT);// 按下 Shift 键

   action.keyDown(Key.ALT);// 按下 Alt 键

   action.keyUp(Keys.CONTROL);// 释放 Ctrl 键

   action.keyUp(Keys.SHIFT);// 释放 Shift 键

   action.keyUp(Keys.ALT);// 释放 Alt 键
      
   sendKeys(keysToSend);//按下修饰键
   sendKeys(Keys.NULL);//释放修饰键

  2) 组合件输入-案例

  SHIFT+a   预期输入A

      Actions action = 
      
        new
      
       Actions(driver); 
      
action.keyDown(Keys.SHIFT).sendKeys(driver.findElement(By.tagName("input")),"a").keyUp(Keys.SHIFT).perform(); // 按下Shift->输入a->释放Shift,结果输入A

  3) 输入修饰键后需要明显释放-案例

      WebElement input = driver.findElement(By.tagName("input"));
      
Actions action = new Actions(driver); action.keyDown(Keys.SHIFT).sendKeys( input,"a").perform(); // 按下Shift->输入a,结果输入A ;未释放Shift
action.sendKeys(input, "b").perform(); // 输入大写B
      WebElement input = driver.findElement(By.tagName("input"));
      
Actions action = new Actions(driver);
action.keyDown(Keys.SHIFT).sendKeys(input
,"a"). keyUp(Keys.SHIFT) .perform(); // 按下Shift->输入a-> 释放Shift ,结果输入A ; 已释放Shift
action.sendKeys(input, "b").perform(); // 输入小写b
  

同理,使用Actions.sendKeys(修饰键)后,需要使用 sendKeys( Keys.NULL )  释放修饰键,否则修饰键一直处于被按下状态

3.robot类处理未枚举键:(未验证)

java.awt.Robot robot = new Robot();
robot.keyPress(java.awt.event.KeyEvent.VK_ALT);
robot.keyPress(java.awt.event.KeyEvent.VK_ALT);

===========================================================================================

更多参考资料:

Selenium java api http://selenium.googlecode.com/git/docs/api/java/index.html

Selenium 源码 git clone https://code.google.com/p/selenium/

文中部分案例摘自网络博客,仅用于学习记录。

【Selenium专题】鼠标键盘事件


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论