Selenium Actions还是Java AWT Robot?

到目前为止,我已经使用了Selenium Actions库来在我们的自动化项目中执行鼠标/键盘操作。

最近,我发现了Java AWT Robot类。 它与Selenium Actions库的可比性如何? 在其中一个中是否存在另一个角落案例? 限制吗? 稳定性? 性能考虑?

这些工具的工作方式存在巨大差异。 Selenium使用WebDriver API并将命令发送到浏览器以执行操作(通过“JSON有线协议”)。

Java AWT Robot使用本机系统事件来控制鼠标和键盘。

如果您正在进行浏览器自动化,理想情况下,您不会使用像Robot这样的东西,因为通常selenium提供的function绰绰有余。 虽然,有些情况下打开了浏览器或本机操作系统弹出窗口,例如,上传/下载文件 – 这也可以通过机器人解决 – 虽然通常有特定的selenium解决方案/解决方案可以帮助避免使用Robot 。 这些变通办法的关键思想是“因为我们无法控制弹出窗口,所以不要让它们被打开”。

例如,当您在Firefox中下载文件时,您将获得一个文件浏览器弹出窗口,建议您选择位置和文件名。 这是使用selenium无法操纵的东西。 但是,你可以做的是让Firefox知道哪些文件类型以及你想在哪里自动保存下载,而不显示弹出窗口。 请参阅Firefox中的“访问文件下载”对话框 。

相关话题:

  • Java AWT机器人| selenium用途
  • 使用Java的Selenium WebDriver和HTML Window位置
  • 使用Java Robot API和Java的Selenium WebDriver进行文件上载的一种解决方案
  • 在Selenium WebDriver中用于自动化目的的机器人类的使用

机器人类

Robot类java.desktop模块的java.awt包中定义。 此类用于处理与Test Automation关联的本机系统输入事件,其中需要控制鼠标键盘Robot Class的主要目的是促进Java平台实现的自动化测试 。 使用Robot Class生成输入事件不同于将事件发布到Java AWT事件队列AWT组件,因为在平台的本机输入队列中使用Robot类事件生成。 例如, Robot.mouseMove实际上会移动鼠标光标而不是仅生成鼠标移动事件

此时值得一提的是,某些平台需要特殊权限或扩展才能访问低级输入控件。 如果当前平台配置不允许输入控件,则在尝试构造Robot对象时将抛出AWTException 。 例如,如果X服务器不支持(或未启用) XTEST 2.2标准扩展 ,则X-Window系统将抛出exception。

一个例子 :

 Robot robot = new Robot(); // Press keys using robot with a gap of of 500 mili seconds is added after every key press robot.keyPress(KeyEvent.VK_S); Thread.sleep(500); robot.keyPress(KeyEvent.VK_T); Thread.sleep(500); robot.keyPress(KeyEvent.VK_A); Thread.sleep(500); robot.keyPress(KeyEvent.VK_S); Thread.sleep(500); robot.keyPress(KeyEvent.VK_I); 

行动类

Actions类在org.openqa.selenium.interactions包中定义,是用于在使用Selenium时模拟复杂用户手势的User-Facing API 。 Actions类允许您构建一个动作链并根据W3C规范执行基于WebDriver API 的动作链 。 通过Selenium 测试自动化时 ,您可以使用此类而不是直接使用键盘或鼠标。 Actions类实现了Builder Pattern ,它可以构建一个CompositeAction,其中包含下面提到的方法调用指定的所有动作:

  • build()
  • click(WebElement target)
  • clickAndHold(WebElement target)
  • contextClick(WebElement target)
  • doubleClick(WebElement target)
  • dragAndDrop(WebElement source, WebElement target)
  • moveToElement(WebElement target, int xOffset, int yOffset)
  • perform()
  • sendKeys(WebElement target, java.lang.CharSequence... keys)

一个例子 :

 Actions act = new Actions(driver); WebDriverWait wait = new WebDriverWait(driver, 10); WebElement electronics = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//li/a[@href='/electronics']"))); act.moveToElement(electronics).perform();