docker - Windows docker 容器中的 selenium 因 ff/chrome “会话因页面崩溃而被删除”而失败
问题描述
带有硒和 ASP.NET 4.5 MVC 的 Docker
我想做什么?
试图拥有一个执行以下操作的 docker 映像。是的,我知道还有其他方法可以在这里完成最终游戏,但我对此有具体要求。
- 运行 ASP.NET MVC 4.5 Web 应用程序
- 通过 ac# 控制台 exe 测试代码有 selenium 驱动程序
当前状态 - 在常规 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
看起来很像
- 2015 年 8 月 11 日的 Docker 问题 (linux) - /dev/shm 大小调整 - https://github.com/elgalu/docker-selenium/issues/20来自 kkochubey1
- Docker 问题(Linux)2018 年 3 月 - https://github.com/pranavgore09/fabric8-planner/pull/3
- ChromeDriver - https://github.com/rshf/chromedriver/issues/772
- Chromium 错误 (linux) - https://bugs.chromium.org/p/chromium/issues/detail?id=522853
我尝试过的事情
- 镀铬标志(不止于此,但......)
option.AddArgument("--disable-dev-shm-usage"); // https://github.com/elgalu/docker-selenium/issues/20#issuecomment-407101358
- 像这样重试驱动程序https://github.com/electron/electron/issues/9369#issuecomment-312234465
- SHM 模式。命令运行但未解决问题
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 并提供它
- 码头工人拉 jhealy62/devfish
- docker run -d --name aspnettest -p 5000:80 jhealy62/devfish
Powershell 进入容器
- docker exec -it aspnettest powershell
在 docker 容器内,查看 web 服务器工作
- curl http://localhost -UseBasicParsing
查看 seleniumtest 失败:
- 光盘\
- cd \硒测试
- .\SeleniumDockerTests.exe http://localhost
跟我一起哭吧!
下一步
- 发布的问题 - Aspnet docker github - https://github.com/Microsoft/aspnet-docker/issues/181
页面超时问题发生了什么?
WebDriver 超时错误已解决 - 发生在 docker 容器内的 FireFox 或 Chrome 测试中。FIX(需要以下两项):
- 将 websocket 安装到 docker 容器中。来自 dockerfile 的摘录:
RUN powershell -Command Add-WindowsFeature Web-WebSockets
- 将一组非常有趣的选项传递给 chromedriver。
option.AddArguments( "--headless","--disable-gpu", "--no-sandbox" );
解决方案
以防万一我把我的解决方案留在这里,也许对某人来说,这会有所帮助)
因此,我们的想法是在单独的容器中运行“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 实例上传您的站点进行测试。
推荐阅读
- javascript - JS:将新对象推送到嵌套数组对象中
- javascript - 正确嵌套三元运算符
- java - 仅在生产中签署 Maven 工件的最佳实践是什么?
- laravel - 我需要这个网站的 http 帖子
- powershell - 通过 Visual Studio 使用 CMake 运行 powershell 脚本而不更改系统范围的权限
- java - 当放置在另一个特定块的顶部时,有什么方法可以删除某个块?
- css - 如何使用 CSS 使复选框和单选按钮中的长标签适当地换行和缩进?
- numpy - 使用自定义数据集进行逻辑回归
- r - 模拟分位数回归中给定 tau = 0.5 和 X 值的响应变量 y
- mfc - MkParseDisplayName 返回无效语法