【问题标题】:Selenium ChromeDriver - Run in background but not headlessSelenium ChromeDriver - 在后台运行但不是无头的
【发布时间】:2018-03-13 17:40:12
【问题描述】:

我正在寻找一种在后台使用 chrome 驱动程序运行 selenium 测试的方法。我的意思是背景,而不是前景聚焦窗口。我实际上可以这样做,但是一旦在 chrome 驱动程序中发生诸如打开新选项卡或在窗口之间切换(基本上是切换窗口句柄)之类的操作,浏览器窗口就会被推到前台。

所以我的问题是,如何在不进行无头测试的情况下防止这种情况发生?

欢迎提出任何建议,欢迎讨论。


编辑

作为一个临时解决方案,我想出了以下方法。

使用 Windows 10 虚拟桌面功能,我在单独的虚拟桌面中运行测试和 Chrome 浏览器窗口。 然后我切换回我的主虚拟桌面以继续执行其他任务。 这可以防止 chrome 浏览器窗口被强制到前台。

请注意,当上述任何操作出现时,任务栏中仍会出现一个闪烁的 chrome 图标。

仍在寻找更可靠的解决方案,因此仍然欢迎任何建议。


为了希望打开新的观点和讨论点,并最终找到一个解决方案,我将提供一些关于我的代码正在做什么的更详细的信息。

我有 5 个 chrome webdrivers,每个 webdrivers 都包含 6 个选项卡 (WindowHandles)。 这个想法是必须在每个选项卡上连续重复某个过程。因此,我们循环遍历每个 webdriver,并在该 webdriver 中遍历每个选项卡,并将此选项卡设置为 webdrivers 当前的 WindowHandle。这会使 chrome 窗口明显地切换到指定的选项卡。

在该切换发生后,基本的 selenium 自动化对选项卡的内容执行,之后我们重复整个过程。

实际问题似乎发生在 chrome webdriver 切换到新选项卡 (WindowHandle) 时,此时包含该选项卡的 chrome 窗口被推到前台并窃取焦点。请注意,这并不总是发生,通常它可以毫无问题地切换选项卡。所以目前还不清楚是否还有其他因素会导致窗口窃取焦点。


编辑 2

执行以下操作后:

我重载了用于切换选项卡(WindowHandles)的selenium方法,并且每次调用SetWindoPos。不幸的是,这也没有解决这个问题。我将尝试更深入地研究可能导致此问题的原因并进行报告。 – S.范登温加特

我在运行测试时出去了几个小时,然后回来发现令人惊讶的是我仍在我的主虚拟桌面(win10 功能)上。这意味着该问题在我离开期间并未发生。我再次开始工作,打开了一个 chrome 窗口,发现在我这样做后不久,焦点又被 chrome 驱动程序的一个窗口窃取了。

我由此得出的结论是,仅当打开另一个 chrome 窗口(不是由 chrome 驱动程序从代码中打开)时才会出现此问题。 我会继续调查并报告最新情况。

在调查此行为几个小时后,我注意到当另一个 chrome 窗口打开时,只要它有焦点,问题就不会发生。所以快速总结一下:

在以下情况下不会出现问题:

  • 没有打开或最小化其他 chrome 窗口(非 selenium 驱动)
  • 另一个 chrome 窗口(非 selenium 驱动)打开并具有焦点
  • 另一个运行全屏模式的应用程序获得焦点

问题确实发生在:

  • 另一个 chrome 窗口(非 selenium 驱动)打开并且没有焦点

请注意,当我谈论另一个 chrome 窗口时,我特指的不是由 selenium 驱动的 chrome 窗口,因此是用户打开的常规 chrome 窗口。

【问题讨论】:

  • 我刚刚回答了另一个问题 (stackoverflow.com/a/49268080/8206275),我认为应该是您的解决方案 - 如果可行,请告诉我,我可以将其更改为答案并将问题标记为重复。
  • 我正要试试这个。由于我运行了多个 chrome 实例,因此通过 id 获取进程似乎更好,但即便如此,我怎么知道哪个 process_id 属于实际的 chrome 窗口? (因为 chrome 包含多个进程)
  • 我在这里得到了我之前评论的答案:superuser.com/questions/133845/…
  • 遗憾的是,这并没有解决问题。感谢您的努力,无论如何都是干净的方法。
  • 嘿,我更新了另一个线程中的答案,修复了我认为与 MainWindowHandles 相关的错误,介意再试一次吗?

标签: c# google-chrome selenium webdriver selenium-chromedriver


【解决方案1】:

最简单的方法是运行本地硒网格。将您的节点作为 Windows 服务启动。这样测试将在后台运行,而不是无头。

【讨论】:

    【解决方案2】:

    另一个扩展您的解决方案的好选择,如果您的机器有能力运行 docker,则使用 zalenium

    这是一个基于 docker 的自动缩放 selenium-grid 解决方案,开箱即用,运行速度非常快。

    您可以通过管理页面实时观看测试、事后观看录音、通过 VNC 实时交互暂停/调试。还有一点要说的是不用担心更改浏览器版本。

    我上次使用它时,它有一个奇怪的错误,并且时不时地抛出一个流结束错误 - 但那是一年前的好事情。

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 1970-01-01
      • 2014-01-07
      • 2015-10-10
      • 1970-01-01
      • 1970-01-01
      • 2022-06-13
      • 2018-10-25
      • 1970-01-01
      相关资源
      最近更新 更多