【问题标题】:selenium inside windows docker container fails with ff/chrome "session deleted because of page crash"Windows docker 容器内的 selenium 因 ff/chrome “会话因页面崩溃而被删除”而失败
【发布时间】:2019-09-21 09:22:21
【问题描述】:

使用 SELENIUM 和 ASP.NET 4.5 MVC 的码头工人

我想做什么?

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

  • 运行 ASP.NET MVC 4.5 Web 应用程序
  • 已通过 c# 控制台 exe 测试代码的 selenium 驱动程序

当前状态 - 在常规 Windows 10 或 Windows 2016 中运行测试时,它运行良好。当测试在 Windows docker 容器中运行时,它会出现“session 由于页面崩溃而被删除”。请注意,我专注于 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

看起来很像

我尝试过的事情

  • chrome 标志(不止于此,但...)
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 并提供它

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

Powershell 进入容器

  • docker exec -it aspnettest powershell

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

查看 seleniumtest 失败:

跟我一起哭吧!

接下来的步骤

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

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

  • 将 websocket 安装到 docker 容器中。摘自 dockerfile:
RUN powershell -Command Add-WindowsFeature Web-WebSockets
  • 将一组非常有趣的选项传递给 chromedriver。
option.AddArguments( "--headless","--disable-gpu", "--no-sandbox" );

【问题讨论】:

  • this 对您有帮助吗?
  • 我之前一直在使用htem。没有这些选项,headless 甚至不会触发。我今天会把它推到铬上。感谢您的对话。
  • 发布到 chromedriver - 于 0506/19 提交到 chromedriver - github.com/rshf/chromedriver/issues/825
  • 有这方面的消息吗?我也面临这个问题...
  • 你为什么不尝试使用“selenium/standalone-chrome”图像,然后从当前容器连接到这个容器?

标签: docker selenium-webdriver selenium-chromedriver docker-for-windows


【解决方案1】:

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

因此,我们的想法是在单独的容器中运行“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 实例上传您的网站进行测试。

【讨论】:

  • 谢谢。客户特别想要容器中的硒,这使它“有趣”。
猜你喜欢
  • 1970-01-01
  • 2017-09-05
  • 2016-10-09
  • 2020-06-09
  • 1970-01-01
  • 2012-11-21
  • 2020-04-29
  • 2019-01-25
  • 1970-01-01
相关资源
最近更新 更多