【问题标题】:Selenium Actions or Java AWT Robot?Selenium 操作或 Java AWT 机器人?
【发布时间】:2015-03-16 07:12:24
【问题描述】:

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

最近,我发现了 Java AWT Robot 类。它与 Selenium Actions 库相比如何?其中一个解决了另一个解决的极端情况吗?限制?稳定?性能考虑?

【问题讨论】:

  • Java Robot 类更容易处理键盘/鼠标事件。

标签: java selenium selenium-webdriver awtrobot


【解决方案1】:

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

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

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

例如,当您在 Firefox 中下载文件时,您会收到一个文件浏览器弹出窗口,建议您选择位置和文件名。这是您无法使用selenium 操作的东西。但是,您可以做的是让 Firefox 知道哪些文件类型以及您想在哪里自动保存下载,而不显示弹出窗口。见Access to file download dialog in Firefox

相关主题:

【讨论】:

  • 感谢您的扩展解释和阅读材料:)
  • 简而言之:Selenium 通过驱动程序自动化浏览器。 Java Robot 通过原生事件自动化系统输入(鼠标和键盘)。
【解决方案2】:

机器人类

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

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

一个例子:

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 Classorg.openqa.selenium.interactions 包中定义,是面向用户的API,用于在使用Selenium 时模拟复杂的用户手势。 Actions 类允许您构建 Chain of Actions 并执行它们,它基于 W3C Specification 之后的 WebDriver API自动化测试Selenium你可以使用这个类而不是直接使用键盘或鼠标。 Actions 类 实现了 Builder 模式,它可以构建一个 CompositeAction,其中包含由下面提到的方法调用指定的所有操作:

一个例子:

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();

【讨论】:

    【解决方案3】:

    我个人更喜欢动作类来执行任何鼠标或键盘事件。 如果在某些环境中使用动作类存在技术故障,那么我们可以使用机器人类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-04
      • 2016-05-31
      • 1970-01-01
      • 2016-06-16
      • 2021-07-23
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      相关资源
      最近更新 更多