首页 > 解决方案 > Windows docker 容器中的 selenium 因 ff/chrome “会话因页面崩溃而被删除”而失败

问题描述

带有硒和 ASP.NET 4.5 MVC 的 Docker

我想做什么?

试图拥有一个执行以下操作的 docker 映像。是的,我知道还有其他方法可以在这里完成最终游戏,但我对此有具体要求。

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

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

关于第 473 行,我们可以看到 docker run 失败。到目前为止,日志文件与良好运行完全相同。然后轰隆隆。那么我们缺少什么导致 docker 容器在那个时候失败呢?

在https://github.com/SeleniumHQ/selenium/issues/7165上发布到 Selenium 在https://github.com/Microsoft/aspnet-docker/issues/181上 发布到 ASP.NET docker repo

看起来很像

我尝试过的事情

option.AddArgument("--disable-dev-shm-usage"); // https://github.com/elgalu/docker-selenium/issues/20#issuecomment-407101358
docker run -d --name aspnet48testsrun --shm-size="1g" -p 5000:80 aspnet48testsd
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

码头工人运行失败

[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 {
   “结果”: {
      “类型”:“字符串”,
      “价值”:“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] 响应导航错误未知错误:由于页面崩溃而删除会话
来自未知错误:无法确定加载状态
从标签崩溃
  (会话信息:无头 chrome=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 {
   “结果”: {
      “类型”:“字符串”,
      “价值”:“http://localhost:29657/”
   }
}
[1556733552.104][DEBUG]:DevTools WebSocket 响应:DOM.getDocument (id=15) 193B5CE9ACD5F7CE56919120C68276A7 {
   “根”: {
      “后端节点ID”:6,
      "baseURL": "http://localhost:29657/",
      “childNodeCount”:1,
      “孩子们”: [ {
         “属性”: [ ],
         “后端节点ID”: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

DevTools 监听 ws://127.0.0.1:49163/devtools/browser/f33a8cd9-6411-46f5-a9ab-d69901cd53c1
[0501/120039.772:ERROR:network_change_notifier_win.cc(156)] WSALookupServiceBegin 失败:0
[捕获异常] =[OpenQA.Selenium.WebDriverException:未知错误:会话因页面崩溃而被删除
来自未知错误:无法确定加载状态
从标签崩溃
  (会话信息:无头 chrome=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(响应错误响应)
   在 OpenQA.Selenium.Remote.RemoteWebDriver.Execute(字符串 driverCommandToExecute,Dictionary`2 参数)
   在 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 镜像。

将其拉下 repo 并提供它

Powershell 进入容器

在 docker 容器内,查看 web 服务器工作

查看 seleniumtest 失败:

跟我一起哭吧!

下一步

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

WebDriver 超时错误已解决 - 发生在 docker 容器内的 FireFox 或 Chrome 测试中。FIX(需要以下两项):

RUN powershell -Command Add-WindowsFeature Web-WebSockets
option.AddArguments( "--headless","--disable-gpu", "--no-sandbox" );

标签: dockerselenium-webdriverselenium-chromedriverdocker-for-windows

解决方案


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

因此,我们的想法是在单独的容器中运行“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

然后在代码中只需连接到现有的 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);

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


推荐阅读