鼠标键盘操作

鼠标键盘操作

  自动化测试时,有些元素不适合直接点击或者进行某些操作时,可以使用Selenium的Actions类来模拟鼠标键盘操作,通过Actions对象可以发起鼠标左键,右键,移动鼠标等操作,最后使用perform方法进行操作。

1、鼠标事件

不带参数的表示针对当前元素操作,带参数的表示针对指定元素操作

1、单击

​ click()

​ click(WebElement target)

2、双击

​ doubleClick()

​ doubleClick(WebElement target)

3、右击

​ contextClick()

​ contextClick(WebElement target)

4、移动

​ moveByOffset(int xOffset, int yOffset)

​ moveToElement(WebElement target)

​ moveToElement(WebElement toElement, int xOffset, int yOffset)

5、左键按下不释放

​ clickAndHold()

​ clickAndHold(WebElement target)

6、释放

​ release()

​ release(WebElement target)

注意:经常与clickAndHold相配合

7、拖动

​ dragAndDrop(WebElement source, WebElement target)

​ dragAndDropBy(WebElement source, int xOffset, int yOffset)


moveToElement:

public static void main(String[] args) throws InterruptedException {
        WebDriver driver = new ChromeDriver();
        driver.get("https://www.baidu.com");
        WebDriver.Window window = driver.manage().window();
        // 最大化
        window.maximize();
        // 创建鼠标对象
        Actions actions = new Actions(driver);
        WebElement element = driver.findElement(By.id("s-usersetting-top"));
        // 移动到设置按钮上去
        actions.moveToElement(element).perform();
        Thread.sleep(3000);
    }

案例:http://www.treejs.cn/v3/demo/cn/exedit/drag.html

clickAndHold()&release()&perform():

public static void main(String[] args) throws InterruptedException {
        WebDriver driver = new ChromeDriver();
        driver.get("http://www.treejs.cn/v3/demo/cn/exedit/drag.html");
        WebDriver.Window window = driver.manage().window();
        // 最大化
        window.maximize();
        // 随意拖拽 1-1元素
        WebElement element = driver.findElement(By.id("treeDemo_2_span"));
        // 随意拖拽 1-2
        WebElement element1 = driver.findElement(By.id("treeDemo_3_span"));
        // 创建鼠标对象
        Actions actions = new Actions(driver);
        actions.clickAndHold(element).moveToElement(element1).release().perform();
        Thread.sleep(3000);
    }

dragAndDrop:

public static void main(String[] args) throws InterruptedException {
        WebDriver driver = new ChromeDriver();
        driver.get("http://www.treejs.cn/v3/demo/cn/exedit/drag.html");
        WebDriver.Window window = driver.manage().window();
        // 最大化
        window.maximize();
        // 随意拖拽 1-1元素
        WebElement element = driver.findElement(By.id("treeDemo_2_span"));
        // 随意拖拽 1-2
        WebElement element1 = driver.findElement(By.id("treeDemo_3_span"));
        // 创建鼠标对象
        Actions actions = new Actions(driver);
        actions.dragAndDrop(element, element1).perform();
        Thread.sleep(3000);
    }

2、键盘事件

1、普通键操作

​ sendKeys(java.lang.CharSequence... keysToSend)

​ sendKeys(WebElement element, java.lang.CharSequence... keysToSend)

2、按下修饰键

​ keyDown(Keys theKey)

​ keyDown(WebElement element, Keys theKey)

​ sendKeys(keysToSend)

3、松开修饰键

​ 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...)

keyDown:

public static void main(String[] args) throws InterruptedException {
    WebDriver driver = new ChromeDriver();
    try {
        // Navigate to Url
        driver.get("https://google.com");

        // Enter "webdriver" text and perform "ENTER" keyboard action
        driver.findElement(By.name("q")).sendKeys("webdriver" + Keys.ENTER);

        Actions actionProvider = new Actions(driver);
        Action keydown = actionProvider.keyDown(Keys.CONTROL).sendKeys("a").build();
        keydown.perform();
    } finally {
        driver.quit();
    }
}

keyUp:

public static void main(String[] args) {
    WebDriver driver = new ChromeDriver();
    try {
      // Navigate to Url
      driver.get("https://google.com");
      Actions action = new Actions(driver);

      // Store google search box WebElement
      WebElement search = driver.findElement(By.name("q"));

      // Enters text "qwerty" with keyDown SHIFT key and after keyUp SHIFT key (QWERTYqwerty)
      action.keyDown(Keys.SHIFT).sendKeys(search,"qwerty").keyUp(Keys.SHIFT).sendKeys("qwerty").perform();
    } finally {
      driver.quit();
    }
  }
}

sendKeys:

public static void main(String[] args) throws InterruptedException {
    WebDriver driver = new ChromeDriver();
    try {
        // Navigate to the url
        driver.get("https://google.com");

        // Create an object of Action class
        Actions action = new Actions(driver);

        // Find google search box element
        WebElement search = driver.findElement(By.name("q"));

        // Send value by action class to the search box
        action.sendKeys(search, "Selenium").perform();

        // Perform Keyboard action by Action class
        action.sendKeys(Keys.ENTER).perform();

    } finally {
        driver.quit();
    }
}

3、执行事件

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

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

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

Actions:

在操作一个页面元素的时候需要一连串的动作配合的时候,可以使用Actions来完成

actions.clickAndHold(onElement).moveToElement(toElement).release().build().perform();

4、案例

1、键盘事件-案例

键盘的划分:

普通键
已枚举: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等,单独按下修饰键本身一般不会触发任何键盘事件,通常和普通建组合使用。

1、普通键盘操作

Actions action = newActions(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 = newActions(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 =newActions(driver);

action.keyDown(Keys.SHIFT).sendKeys(input,"a").keyUp(Keys.SHIFT).perform();//按下Shift->输入a->释放Shift,结果输入A;已释放Shiftaction.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);

2、鼠标事件-案例

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 = newActions(driver);

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

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

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

Actions action = newActions(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 = newActions(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 = newActions(driver);

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

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

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

Actions action = newActions(driver);

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

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

Actions action = newActions(driver);

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

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

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

Actions action = newActions(driver);

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

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

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

posted @ 2022-04-16 01:28  boge_blogs  阅读(268)  评论(0编辑  收藏  举报