使用Selenium和NUnit控制台的Chrome驱动程序错误:无法发现打开的页面

时间:2016-09-01 15:56:43

标签: selenium nunit selenium-chromedriver cruisecontrol.net

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

在cc.net上运行也导致开放超过30~40个chromedriver进程,最终导致无法发现打开页面"。 在命令行上运行很好,只有1个chromedriver进程。

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

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

3 个答案:

答案 0 :(得分:1)

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

这意味着尝试创建新(可见)窗口的任何进程或子进程可能会出错。控制台窗口看起来很好,因为它们共享一个公共实例(可能?)。根据经验和测试,这是一个MS windows'问题'未本地化为CCNet。

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

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

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

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

答案 1 :(得分:1)

我与MSTestMicrosoft Test Agents存在完全相同的问题,以下是我如何设法修复它的解决方案。但是,我不知道CruiseControl,所以我不知道你是否可以安装它作为一个进程运行。

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

Chrome正试图离开会话0,你可以在这里找到更多的参考资料(下面的链接中的评论21,但实际上整个帖子对于这个主题是一个很好的阅读):https://bugs.chromium.org/p/chromium/issues/detail?id=615396#c21

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

最佳解决方案是将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语句时才会执行。由于{{1}的数量,我因测试服务器上的内存耗尽而结束1}}实例打开。

答案 2 :(得分:0)

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

  • 在CI服务器上打开会话
  • 从命令行运行ChromeDriver.exe
  • 保持会话开放

现在,selenium webdriver可以连接到chromedriver监听其特定端口并具有与之交互的图形会话。