Windows docker容器内的硒失败,出现ff / chrome“会话由于页面崩溃而被删除”

Joe*_*aly 17 selenium-chromedriver selenium-webdriver docker docker-for-windows

带有硒和ASP.NET 4.5 MVC的DOCKER

我想做什么?

尝试具有以下的docker映像。是的,我知道还有其他方法可以在此处完成最终游戏,但是对此我有特定要求。

  • 运行ASP.NET MVC 4.5 Web应用程序
  • 具有硒驱动程序通过ac#控制台exe测试代码

当前状态-在常规Windows 10或Windows 2016中运行测试时,它运行良好。当测试在Windows docker容器中运行时,测试失败,“ 会话由于页面崩溃而被删除 ”。请注意,我专注于chrome测试,但使用FireFox也会得到相似的结果。

我打开了硒铬的详细调试程序,并捕获了日志文件。我有两个日志文件。“ goodrun_log.txt”来自Windows 10成功测试。“ docker_log.txt”是容器内运行失败的日志。

关于第473行,我们可以看到Docker运行失败。到那时为止,日志文件与正常运行完全相同。然后繁荣。那么,我们缺少什么使Docker容器在此时失败?

发表于硒在https://github.com/SeleniumHQ/selenium/issues/7165 发布到ASP.NET泊坞窗回购在https://github.com/Microsoft/aspnet-docker/issues/181

与SEEMS类似

我尝试过的事情

  • chrome标志(不止如此,但...)
option.AddArgument("--disable-dev-shm-usage"); // https://github.com/elgalu/docker-selenium/issues/20#issuecomment-407101358
Run Code Online (Sandbox Code Playgroud)
docker run -d --name aspnet48testsrun --shm-size="1g" -p 5000:80 aspnet48testsd
Run Code Online (Sandbox Code Playgroud)
  • 记忆
docker run -d --name aspnet48testsrun -m inf --memory-swap inf -p 5000:80 aspnet48tests
docker run -d --name aspnet48testsrun -m 2g -p 5000:80 aspnet48tests
Run Code Online (Sandbox Code Playgroud)

DOCKER运行失败

[1556732925.450] [DEBUG]:DevTools WebSocket事件:DOM.documentUpdated 7FCEC12C5F4ADEA352BBA3DF3AF6075D {

}
[1556732925.450] [DEBUG]:DevTools WebSocket命令:DOM.getDocument(id = 15)7FCEC12C5F4ADEA352BBA3DF3AF6075D {

}
[1556732925.451] [DEBUG]:DevTools WebSocket响应:Runtime.evaluate(id = 14)7FCEC12C5F4ADEA352BBA3DF3AF6075D {
   “结果”:{
      “ type”:“ string”,
      “ value”:“ http:// localhost /”
   }
}
[1556732925.531] [DEBUG]:DevTools WebSocket事件:Inspector.targetCrashed 7FCEC12C5F4ADEA352BBA3DF3AF6075D {

}
[1556732925.532] [INFO]:正在等待挂起的导航...
[1556732925.532] [DEBUG]:DevTools WebSocket命令:Runtime.evaluate(id = 16)7FCEC12C5F4ADEA352BBA3DF3AF6075D {
   “表达式”:“ 1”
}
[1556732925.532] [INFO]:等待等待的导航完成。状态:未知错误:无法确定加载状态
从标签页崩溃
[1556732925.552] [INFO]:[464b2b630c39434969f9b90e11b7aa37]响应导航错误未知错误:由于页面崩溃,会话已删除
来自未知错误:无法确定加载状态
从标签页崩溃
  (会议信息:无头铬= 74.0.3729.108)
[1556732925.552] [DEBUG]:日志类型“驱动程序”在销毁时丢失了0个条目
[1556732925.552] [DEBUG]:日志类型“浏览器”在销毁时丢失了0个条目

WIN10跑好

[1556733552.098] [DEBUG]:DevTools WebSocket事件:DOM.documentUpdated 193B5CE9ACD5F7CE56919120C68276A7 {

}
[1556733552.098] [DEBUG]:DevTools WebSocket命令:DOM.getDocument(id = 15)193B5CE9ACD5F7CE56919120C68276A7 {

}
[1556733552.104] [DEBUG]:DevTools WebSocket响应:Runtime.evaluate(id = 14)193B5CE9ACD5F7CE56919120C68276A7 {
   “结果”:{
      “ type”:“ string”,
      “ value”:“ http:// localhost:29657 /”
   }
}
[1556733552.104] [DEBUG]:DevTools WebSocket响应:DOM.getDocument(id = 15)193B5CE9ACD5F7CE56919120C68276A7 {
   “根”: {
      “ backendNodeId”:6
      “ baseURL”:“ http:// localhost:29657 /”,
      “ childNodeCount”:1,
      “儿童”:[{
         “属性”:[],
         “ backendNodeId”:7
         “ childNodeCount”:2
...更多...

会话由于页面崩溃而被删除

PS C:\ seleniumtests> .. \ SeleniumDockerTest.exe http:// localhost
[chrome选项:] = [---- headless --no-sandbox --disable-gpu]
在端口49160上启动ChromeDriver 74.0.3729.6(255758eccf3d244491b8a1317aa76e1ce10d57e9-refs / branch-heads / 3729 @ {#29})
仅允许本地连接。
请保护ChromeDriver和相关测试框架使用的端口,以防止恶意代码访问。
[0501 / 120039.381:ERROR:network_change_notifier_win.cc(156)] WSALookupServiceBegin失败,原因为:0
[0501 / 120039.428:ERROR:audio_device_listener_win.cc(46)] RegisterEndpointNotificationCallback失败:80070424

在ws://127.0.0.1:49163 / devtools / browser / f33a8cd9-6411-46f5-a9ab-d69901cd53c1上监听的DevTools
[0501 / 120039.772:ERROR:network_change_notifier_win.cc(156)] WSALookupServiceBegin失败,原因为:0
[捕获的异常] = [OpenQA.Selenium.WebDriverException:未知错误:由于页面崩溃而删除了会话
来自未知错误:无法确定加载状态
从标签页崩溃
  (会议信息:无头铬= 74.0.3729.108)
  (驱动程序信息:chromedriver = 74.0.3729.6(255758eccf3d244491b8a1317aa76e1ce10d57e9-refs / branch-heads / 3729 @ {#29}),platform = Windows NT 10.0.17763 x86_64)
   在OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
   在OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute,Dictionary`2 parameters)
   在OpenQA.Selenium.Remote.RemoteWebDriver.set_Url(字符串值)
   在OpenQA.Selenium.Remote.RemoteNavigator.GoToUrl(字符串url)
   在C:\ dev \ docker-selenium-aspnet45.git \ SeleniumDockerTest \ Program.cs:line 60中的SeleniumDockerTest.Program.DoChromeTests()

自己尝试

https://cloud.docker.com/repository/docker/jhealy62/devfish上有一个带有Windows,IIS,Chrome,FF和一些测试的Docker映像。

将其拉回仓库并配置

  • docker pull jhealy62 / devfish
  • docker run -d --name aspnettest -p 5000:80 jhealy62 / devfish

将Powershell放入容器

  • 泊坞窗exec -it aspnettest powershell

在Docker容器内,查看Web服务器的工作情况

看到seleniumtest失败:

和我一起哭!

下一步

页面超时问题发生了什么?

解决了WebDriver超时错误-在Docker容器内发生FireFox或Chrome测试时发生。FIX(需要下面的两个项目):

  • 将websocket的安装到docker容器中。摘自dockerfile:
docker run -d --name aspnet48testsrun -m inf --memory-swap inf -p 5000:80 aspnet48tests
docker run -d --name aspnet48testsrun -m 2g -p 5000:80 aspnet48tests
Run Code Online (Sandbox Code Playgroud)
  • 将一组非常有趣的选项传递给chromedriver。
option.AddArguments( "--headless","--disable-gpu", "--no-sandbox" );
Run Code Online (Sandbox Code Playgroud)

Ser*_*nko 2

以防万一我将我的解决方案留在这里,也许对某人来说,这会有帮助)

因此,我们的想法是在单独的容器中运行“selenium/standalone-chrome”图像。

首先设置“docker-compose.yml”文件,如下所示:

version: '3.8'
services:
 chrome:
    image: <your_storage>/standalone-chrome
    restart: always
    ports: 
      - 4444:4444
    networks:
     front:
        ipv4_address: 172.16.238.5
 net-worker:
    build: <your_storage>/<your_project>
    depends_on: 
      - chrome
    networks:
     front:
        ipv4_address: 172.16.238.10 

  networks:
   front:
    driver: bridge
    ipam:
        config:
         - subnet: 172.16.238.0/24
Run Code Online (Sandbox Code Playgroud)

然后在代码中连接到现有的 chrome 实例

var options = new ChromeOptions();
options.AddArguments("--headless");
options.AddArgument("no-sandbox");
_chrome = new RemoteWebDriver(new Uri("http://172.16.238.5:4444/wd/hub"), options);
Run Code Online (Sandbox Code Playgroud)

现在您可以使用此 chrome 实例上传您的网站进行测试。