Windows Docker 容器中的Selenium因 FF/Chrome "session deleted because of page crash"而失败



>DOCKER WITH SELENIUM AND ASP.NET 4.5 MVC

我想做什么?

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

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

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

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

关于第 473 行,我们可以看到 docker 运行失败。 到目前为止,日志文件与正常运行完全相同。 然后轰隆隆。 那么我们缺少什么使 docker 容器在这一点上失败呢?

发表于 Selenium at https://github.com/SeleniumHQ/selenium/issues/7165 发布到 ASP.NET docker 存储库 at https://github.com/Microsoft/aspnet-docker/issues/181

似乎类似于

  • Docker 问题 (linux) on 八月 11 2015 -/dev/shm ssize - https://github.com/elgalu/docker-selenium/issues/20 by kkochubey1
  • Docker 问题 (linux) 2018 年 3 月 - https://github.com/pranavgore09/fabric8-planner/pull/3
  • 铬驱动程序 - https://github.com/rshf/chromedriver/issues/772
  • 铬错误 (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][调试]: DevTools WebSocket 事件: DOM.documentUpdated 7FCEC12C5F4ADEA352BBA3DF3AF6075D { } [1556732925.450][DEBUG]: DevTools WebSocket Command: DOM.getDocument (id=15) 7FCEC12C5F4ADEA352BBA3DF3AF6075D { } [1556732925.451][DEBUG]: DevTools WebSocket Response: Runtime.evaluate (id=14) 7FCEC12C5F4ADEA352BBA3DF3AF6075D {  "结果":{ "类型": "字符串", "值": "http://localhost/"  } } [1556732925.531][调试]: DevTools WebSocket 事件: Inspector.targetCrashed 7FCEC12C5F4ADEA352BBA3DF3AF6075D { } [1556732925.532][信息]:正在等待待处理的导航... [1556732925.532][DEBUG]: DevTools WebSocket Command: Runtime.evaluate (id=16) 7FCEC12C5F4ADEA352BBA3DF3AF6075D {  "表达式":"1" } [1556732925.532][信息]:已完成等待挂起的导航。状态:未知 错误:无法确定加载状态 从选项卡崩溃 [1556732925.552][信息]: [464b2b630c39434969f9b90e11b7aa37] 响应导航错误未知错误: 由于页面崩溃,会话已删除 来自未知错误:无法确定加载状态 从选项卡崩溃 (会话信息:无头铬=74.0.3729.108) [1556732925.552][调试]:日志类型"驱动程序"在销毁时丢失了 0 个条目 [1556732925.552][调试]:日志类型"浏览器"在销毁时丢失了 0 个条目

WIN10 运行良好

[
1556733552.098][调试]: DevTools WebSocket 事件: DOM.documentUpdated 193B5CE9ACD5F7CE56919120C68276A7 { } [1556733552.098][DEBUG]: DevTools WebSocket Command: DOM.getDocument (id=15) 193B5CE9ACD5F7CE56919120C68276A7 { } [1556733552.104][DEBUG]: DevTools WebSocket Response: Runtime.evaluate (id=14) 193B5CE9ACD5F7CE56919120C68276A7 {  "结果":{ "类型": "字符串", "值": "http://localhost:29657/"  } } [1556733552.104][调试]: DevTools WebSocket 响应: DOM.getDocument (id=15) 193B5CE9ACD5F7CE56919120C68276A7 {  "根":{ "backendNodeId": 6, "基本网址": "http://localhost:29657/", "子节点计数": 1, "儿童":[ {  "属性": [ ],  "backendNodeId": 7,  "子节点计数": 2, ...更多...

由于页面崩溃而删除会话

PS C:\seleniumtests> .\SeleniumDockerTest.exe http://localhost [chrome 选项:] =[--无头 --无沙盒 --禁用-GPU] 在端口 49160 上启动 ChromeDriver 74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}) 仅允许本地连接。 请保护 ChromeDriver 和相关测试框架使用的端口,以防止恶意代码访问。 [0501/120039.381:错误:network_change_notifier_win.cc(156)]WSALookupServiceBegin 失败,并显示: 0 [0501/120039.428:错误:audio_device_listener_win.cc(46)]注册端点通知回调失败:80070424 DevTools 监听 ws://127.0.0.1:49163/devtools/browser/f33a8cd9-6411-46f5-a9ab-d69901cd53c1[0501/120039.772:错误:network_change_notifier_win.cc(156)]WSALookupServiceBegin 失败,并显示: 0 [异常捕获] =[OpenQA.Selenium.WebDriver异常:未知错误:由于页面崩溃而删除会话 来自未知错误:无法确定加载状态 从选项卡崩溃 (会话信息:无头铬=74.0.3729.108) (驱动程序信息: chromedriver=74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}),platform=Windows NT 10.0.17763 x86_64)  at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)  at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary'2 parameters)  在OpenQA.Selenium.Remote.RemoteWebDriver.set_Url(字符串值)  at OpenQA.Selenium.Remote.RemoteNavigator.GoToUrl(String url)  at SeleniumDockerTest.Program.DoChromeTests() in C:\dev\docker-selenium-aspnet45.git\SeleniumDockerTest\Program.cs:line 60]

自己试试

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

将其下拉到存储库并预配它

  • 码头工人拉 Jhealy62/Devfish
  • docker run -d --name aspnettest -p 5000:80 jhealy62/devfish

电源外壳放入容器中

  • Docker exec -it ASPnettest PowerShell

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

  • curl http://localhost -UseBasicParsing

查看硒测试失败:

  • 光盘 \
  • CD \硒测试
  • .\SeleniumDockerTests.exe http://localhost

和我一起哭!

后续步骤

  • 已发布问题 - Aspnet docker github - https://github.com/Microsoft/aspnet-docker/issues/181

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

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

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

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

因此,我们的想法是在单独的容器中运行"硒/独立铬"图像。

首先设置你的"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 实例上传您的网站进行测试。

相关内容

最新更新