【问题标题】:Way to open Selenium browser not overlapping my current browser打开 Selenium 浏览器的方法不与我当前的浏览器重叠
【发布时间】:2019-02-09 07:01:07
【问题描述】:

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

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

我现在拥有的:

【问题讨论】:

  • 你的用例我还不清楚。
  • @cruisepandey 我想运行测试,所以 Selenium 浏览器窗口不是在我的浏览器窗口前面打开,而是在后台打开
  • 作为解决方法尝试类似driver.manage().window().setPosition(newPoint(0, 2000)); (不确定Java 语法正确性)。还要检查this
  • 国际海事组织,这是不可能的。因为当您手动执行此操作时,新的浏览器窗口会在当前窗口的前面打开。虽然您可以启动可调整大小的 chrome,但我认为这不是您的用例。
  • 没问题的,可以用@Andersson解决方案

标签: java selenium google-chrome firefox serenity-bdd


【解决方案1】:

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

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

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

  • 另外,

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

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

  • 另外,

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

  • 最后,按照Internet Explorer and Native Events

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

  • 浏览器焦点:

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

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

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

结论

始终将测试环境开发环境分开,并且完全不受人工干预的影响。

【讨论】:

  • 感谢您的回答!这是有道理的。理想情况下,我必须使用单独的服务器来运行我的测试。
  • @DebanajanB 如果我在浏览器出现时最小化浏览器会不会有问题。我的测试会顺利运行吗?
  • @jsduniya 我已经列出了与 Action 类、clicksNative Events 相关的所有影响>鼠标事件在单独的部分。请浏览一遍答案,如果有任何问题,请告诉我。
  • @DebanjanB 谢谢,我很难在这些细节中找到我的问题,我的问题是即使最小化浏览器窗口也会影响我的测试用例?因为我没有对正在运行的测试用例的浏览器视口进行任何事件操作,所以我只是单击浏览器的最小化图标(-)。
  • @jsduniya 我又添加了一个规范的重复目标。如果您有任何问题,请告诉我。
【解决方案2】:

浏览器是出现在当前浏览器上还是在后台,取决于驱动程序的实现以及浏览器之间的变化——它不依赖于 Selenium 或 Serenity。但是我通常在无头模式下在 chrome 中运行测试,这完全解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-28
    • 2020-06-13
    • 2021-06-10
    • 2017-07-14
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多