【问题标题】:Chrome Driver Error using Selenium and NUnit Console: Unable to Discover Open Pages使用 Selenium 和 NUnit 控制台的 Chrome 驱动程序错误:无法发现打开的页面
【发布时间】:2017-01-09 14:33:46
【问题描述】:

我所有的 Selenium 测试只有在通过 Cruisecontrol.net 运行时才会失败,而使用同一用户(在其上运行 cc.net)通过命令行运行它似乎很好。

在 cc.net 上运行也会导致打开 30~40 多个 chromedriver 进程,最终导致“无法发现打开的页面”。 在命令行上运行很好,并且只有 1 个 chromedriver 进程。

到目前为止,我已经尝试过: --no-sandbox 选项, 该用户的电源设置更改, 将 Chromedriver 更新到最新版本 & 重新启动并重新启动 cc.net 服务和服务器

非常感谢任何帮助....

【问题讨论】:

  • 确认一下,CruiseControl.net 是否在失败时作为 Windows 服务运行?

标签: selenium nunit selenium-chromedriver cruisecontrol.net


【解决方案1】:

我也有同样的问题。我设置的(丑陋的)解决方法是:

  • 在 CI 服务器上打开一个会话
  • 从命令行运行ChromeDriver.exe
  • 让会话保持打开状态

现在 selenium webdriver 可以连接到chromedriver,监听其特定端口并进行图形会话交互。

【讨论】:

    【解决方案2】:

    MSTestMicrosoft Test Agents 遇到了完全相同的问题,下面是我如何解决它的解决方案。不过不知道CruiseControl,所以不知道能不能安装成进程运行。

    基本上,测试代理是作为服务安装的,从 Windows (NT) 服务启动的每个进程都在会话 0 上运行,登录用户不可见。

    Chrome 正试图摆脱 Session 0,您可以在此处找到有关此内容的更多参考资料(下面链接中的评论 21,但实际上整个线程对于这个主题来说是一个很好的阅读):https://bugs.chromium.org/p/chromium/issues/detail?id=615396#c21

    现在,要解决此问题,有几个可用选项: 从 Chrome 下载 Canary 版本,但不建议这样做,因为这只是临时修复。 Chrome 开发人员表示,在不久的将来 Session 0 将不再适用于 Chrome(和 ChromeDriver)。

    最好的解决方案是将 MS Test Agent 作为进程安装,以便所有应用程序对登录用户可见。更多细节可以在这里找到:https://msdn.microsoft.com/en-us/library/ee291332.aspx

    另一个选项是将以下设置添加为 Chrome 参数,但是我没有使用测试代理作为 Windows 服务进行测试,所以我不知道它是否有效,但我可以确认它作为一个进程与测试代理一起工作。

    var chromeOptions = new ChromeOptions();
    chromeOptions.AddArguments("test-type");
    chromeOptions.AddArguments("--disable-extensions");
    chromeOptions.AddArguments("no-sandbox");
    var driver = new ChromeDriver(chromeOptions);
    

    至于ChromeDriver 打开的多个实例,问题又出在MSTest 上,所以NUnit 可能不同,但我的问题是TestInitialize 方法中的测试失败。发生这种情况时,将不再调用 TestCleanup。似乎TestCleanup 仅在TestMethod 失败并且我的driver.Quit(); 语句在TestCleanup 中时才被执行,由于ChromeDriver 实例的数量打开,我以测试服务器上的内存耗尽而告终。

    【讨论】:

    • 感谢 Cosmin,在这种情况下,您对会话 0 和 1 的分析似乎是合乎逻辑的。到目前为止,在我降级 Chrome 浏览器和 chromedriver 后,它们似乎工作正常
    【解决方案3】:

    我在过去通过 CCNet 运行一些任务时遇到过问题,这些任务通常需要在 MS 窗口的上下文中创建 window

    这意味着任何试图创建新(可见)窗口的进程或子进程都可能行为不端。控制台窗口似乎很好,因为它们共享一个公共实例(也许?)。根据经验和测试,这是一个未本地化到 CCNet 的 MS Windows“问题”。

    我在 selenium 中遇到过这种情况,因为它通常驱动浏览器(它本身 - 试图 - 显示一个窗口)。我已经在 CCNet 中通过 selenium 驱动 PhantomJs 取得了成功(作为有限服务运行时)

    如果 Windows 服务设置为以SYSTEM 运行,那么您可以允许该服务“与桌面交互”。这允许服务在服务帐户下创建新窗口。但是,根据我的经验,这仅在附加用户会话时才有效*;断开会话将返回到非工作行为。

    * 这是 windows 提示用户连接到SYSTEM 服务窗口站以查看交互内容(windows)的时候。它可能只在windows服务器上支持,我想我只有在通过远程桌面连接到服务器时才看到它。

    除了通过PSEXEC 将进程调用到行为符合预期且始终如一的服务器/会话之外,我找不到解决此问题的优雅方法。

    【讨论】:

      猜你喜欢
      • 2014-01-26
      • 2019-10-02
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 2020-07-29
      • 2020-08-05
      • 2017-05-01
      • 1970-01-01
      相关资源
      最近更新 更多