首页 > 解决方案 > 打开 Selenium 浏览器的方法不与我当前的浏览器重叠

问题描述

我有以下情况。一旦我开始 Selenium 测试,就会打开一个浏览器窗口。由于我有一堆测试并且我每天都启动它们很多次,我不会让 Selenium 在我当前的浏览器(我正在工作的地方)的前面打开新的浏览器窗口,而是在后台,所以它不会不要打扰我。可能吗?

PS澄清为什么我需要这个 - 一天很多次,当我在当前浏览器中工作并且硒测试正在运行时,Selenium 的每个测试的浏览器窗口都会突然打开,我可以突然关闭它,输入一些东西等等。

我现在拥有的:

图像

标签: javaseleniumgoogle-chromefirefoxserenity-bdd

解决方案


软件测试自动化开始是一门艺术。您的测试台应该是:

  • 配置了所有必需的软件二进制文件
  • 测试执行必须在受控环境中执行以优化性能。
  • 在您@Tests执行时,它应该不受Manual Intervention的影响。
  • 特别是当您@Tests是基于Selenium的,而测试执行正在进行时,不应干预测试环境,因为:

    • 在最低级别,actions 类的行为旨在尽可能接近地模拟远程端与实际输入设备的行为,并且实施策略可能涉及例如将合成事件注入浏览器事件循环。因此,发送动作的步骤将不可避免地在特定于实现的领域中结束。但是,某些内容可观察到的效果必须在实现之间保持一致。为了适应这一点,规范要求远程端执行特定于实现的动作分派步骤,以及事件列表及其属性。这个列表并不全面;特别是输入源的默认操作可能会导致根据浏览器的实现和状态生成其他事件(例如,当焦点位于可编辑元素上时,与关键操作相关的输入事件,

  • 此外,

    • 由 WebDriver API 用户生成的激活触发器需要与由与浏览器交互的真实用户生成的触发器没有区别。特别是,调度的事件将 isTrusted 属性设置为 true。调度这些事件的最可靠方法是在浏览器实现本身中创建它们。将特定于操作系统的输入消息发送到浏览器窗口的缺点是,正在自动化的浏览器可能无法与用户意外修改输入源状态正确隔离。使用操作系统级别的可访问性 API 的缺点是浏览器的窗口必须聚焦,因此,多个 WebDriver 实例不能并行运行。

    • 操作系统级可访问性 API 的一个优点是它保证输入正确反映用户输入,并在必要时允许与主机操作系统交互。但是,从机器利用率的角度来看,这可能会带来性能损失。

  • 此外,

    • Robot Class用于生成本地系统输入事件,用于测试自动化、自运行演示和其他需要控制鼠标和键盘的应用程序。Robot 的主要目的是促进 Java 平台实现的自动化测试。使用类生成输入事件不同于将事件发布到 AWT 事件队列或 AWT 组件,因为事件是在平台的本机输入队列中生成的。例如,Robot.mouseMove 实际上会移动鼠标光标,而不仅仅是生成鼠标移动事件。

  • 最后,根据Internet Explorer 和 Native Events

    • 由于 InternetExplorerDriver 仅适用于 Windows,因此它尝试使用所谓的“本机”或操作系统级别的事件在浏览器中执行鼠标和键盘操作。这与使用模拟的 JavaScript 事件进行相同的操作形成对比。使用本机事件的优点是它不依赖于 JavaScript 沙箱,并且可以确保在浏览器中正确地传播 JavaScript 事件。但是,当 IE 浏览器窗口没有焦点以及尝试将鼠标悬停在元素上时,当前存在一些鼠标事件问题。

  • 浏览器焦点:

    • 挑战在于,如果窗口没有焦点,IE 本身似乎并不完全尊重我们发送给 IE 浏览器窗口(WM_MOUSEDOWN 和 WM_MOUSEUP)的 Windows 消息。具体来说,被点击的元素会收到一个围绕它的焦点窗口,但点击不会被该元素处理。可以说,我们根本不应该发送消息。相反,我们应该使用 SendInput() API,但该 API 明确要求窗口具有焦点。我们与 WebDriver 项目有两个相互冲突的目标。

    • 首先,我们努力尽可能地模仿用户。这意味着使用原生事件而不是使用 JavaScript 模拟事件。

    • 其次,我们不希望自动聚焦浏览器窗口。这意味着仅将浏览器窗口强制置于前台是次优的。

结论

始终保持测试环境与开发环境分开,并且完全不受手动干预


推荐阅读