Selenium Actions or Java AWT Robot?



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

最近,我发现了Java AWT Robot类。它如何与硒行动库相提并论?其中一个中是否有一些极端情况需要另一个解决?限制?稳定性?性能注意事项?

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

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

如果您正在进行浏览器自动化,理想情况下,您永远不会使用Robot之类的东西,因为通常 Selenium 提供的功能绰绰有余。虽然,在某些情况下,会打开浏览器或本机操作系统弹出窗口,例如上传/下载文件 - 这也是可以用 Robot 解决的问题 - 尽管通常有特定于硒的解决方案/解决方法可以帮助避免使用 Robot 。这些解决方法的关键思想是"由于我们无法控制弹出窗口,因此不要让它们被打开"。

例如,当您在 Firefox 中下载文件时,您会看到一个文件浏览器弹出窗口,建议您选择一个位置和文件名。这是您无法使用selenium进行操作的。但是,您可以做的是让Firefox知道要自动保存下载的文件类型和位置,而无需显示弹出窗口。请参阅在 Firefox 中访问文件下载对话框。

相关主题:

  • 爪哇AWT机器人 |硒用途
  • Selenium WebDriver 和 HTML 窗口位置通过使用 Java
  • 使用Java Robot API和Selenium WebDriver通过Java上传文件的一种解决方案
  • 在硒网络驱动程序中使用机器人类以实现自动化目的

机器人类

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

在这一点上值得一提的是,一些平台需要特殊权限或扩展才能访问低级输入控制。如果当前平台配置不允许输入控制,则在尝试构造机器人对象时将抛出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 Class 在 org.openqa.selenium.interactions 包中定义,是面向用户的 API,用于在使用 Selenium 时模拟复杂的用户手势。Actions 类允许您构建操作链并执行它们,这些操作基于 W3C 规范的 WebDriver API。通过 Selenium测试自动化时,您可以使用此类,而不是直接使用键盘或鼠标。Actions 类实现了生成器模式,该模式可以构建一个复合操作,其中包含下面提到的方法调用指定的所有操作

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

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

最新更新