在jenkins中使用Docker从属时,Selenium驱动程序崩溃并给出NoSuchSessionException

时间:2017-05-17 20:19:27

标签: java linux selenium docker jenkins

我正在使用带有jenkins的Docker奴隶并使用jenkins运行Selenium测试。我得到的NoSuchSessionException是在司机崩溃后开始的。

org.openqa.selenium.NoSuchSessionException: no such session
(Driver info: chromedriver=2.29.461571
(8a88bbe0775e2a23afda0ceaf2ef7ee74e822cc5),platform=Linux 
4.4.0-72-generic x86_64) (WARNING: The server did not provide any stacktrace information) Command duration or timeout: 4 milliseconds
Build info: version: '3.3.1', revision: '5234b32', time: '2017-03-10
09:04:52 -0800', ip: '127.0.1.1',
os.name: 'Linux', os.arch: 'amd64', os.version: '4.4.0- 72-generic',
java.version: '1.8.0_121' Driver info:
org.openqa.selenium.chrome.ChromeDriver Capabilities [{message=unknown
error: Chrome failed to start: exited abnormally (Driver info:
chromedriver=2.29.461571
(8a88bbe0775e2a23afda0ceaf2ef7ee74e822cc5),platform=Linux 
4.4.0-72-generic x86_64), platform=ANY}] Session ID: 322db879fc80f5e9d8a7a3b77df7e52f at
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at
 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
 at
 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
 at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at
 org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:216)
 at
 org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:168)
 at
 org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:638)
 at
 org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:661)

测试在本地linux系统上运行完美。 因为我正在使用Jenkins管道,所以测试在奴隶上运行,对于Slave来说这里的信息很少:

  

ARG JENKINS_SWARM_VERSION = 3.3 ARG NODE_VERSION = 6.10.0

     

ARG CHROMEDRIVER_VERSION = 2.29 ARG GECKODRIVER_VERSION = 0.16.1

     

ENV JENKINS_DATA / var / lib / jenkins ENV NPM_CONFIG_LOGLEVEL info

     

显示选项ENV DEBIAN_FRONTEND非交互式ENV DEBCONF_NONINTERACTIVE_SEEN为真

     

ENV SCREEN_WIDTH 1360 ENV SCREEN_HEIGHT 1020 ENV SCREEN_DEPTH 24 ENV   显示:99.0   运行mkdir -p / opt / chromedriver- $ CHROMEDRIVER_VERSION \&&卷曲-sS   -o /tmp/chromedriver_linux64.zip http://chromedriver.storage.googleapis.com/ $ CHROMEDRIVER_VERSION / chromedriver_linux64.zip   \&& unzip -qq /tmp/chromedriver_linux64.zip -d   / opt / chromedriver- $ CHROMEDRIVER_VERSION \&& R M   /tmp/chromedriver_linux64.zip \&& chmod + x   / opt / chromedriver- $ CHROMEDRIVER_VERSION / chromedriver \&& ln -fs   /选择/ chromedriver- $ CHROMEDRIVER_VERSION / chromedriver   的/ usr / local / bin中/ chromedriver

我还使用导出DBUS_SESSION_BUS_ADDRESS = / dev / null。在Docker中的shm接近1.0G。 仍然无法追踪信息。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。 1.问题:Chrome及其沙盒 正如我们所知,将Chrome中的所有“标签”包裹在沙箱中,并使用自己的流程。我不知道的是Chrome使用的是unix虚拟化工具。 Docker容器中不允许使用的工具。 “简单”解决方案将使用-priviledged启动容器,这当然是不合适的,或者为容器分配“SYS_ADMIN”功能 - 同样令人不快。 我现在在Webtest驱动程序中所做的工作将Chrome浏览器沙箱用于:

String [] args = {“ - no-sandbox”}; chromeOptions.put(“args”args);

因此铬开始至少再增加一μs。 2.下一个问题是主机主机中缺少X服务器。要执行此操作,您必须以某种形式使用屏幕缓冲,因为Chrome必须与显示器连接。 您也可以使用xhost local:root等将dockercontainer与dockerhost的显示连接起来但我无法运行。 Selenium通过用xvfb(虚拟framebuffe)包装它在NodeBase中做到这一点。

> Xvfb-run -n $ SERVERNUM --server -args = "- screen 0 $ GEOMETRY -ac + extension RANDR"   Java $ {JAVA_OPTS} -jar /opt/selenium/selenium-server-standalone.jar \
>     -role node \
>     -hub http: // $ HUB_PORT_4444_TCP_ADDR: $ HUB_PORT_4444_TCP_PORT / grid / register \
>     -nodeConfig /opt/selenium/config.json \
>     $ {SE_OPTS} & NODE_PID = $!

我最初尝试过同义词,但这不起作用,因为我们只注册了swarm客户端,并且没有在包装器中调用./gradlew测试。或者我太愚蠢了。

无论如何,我解决了现在使用的Jenkins插件,它更漂亮并且可以使用管道。在这种情况下,您只需将带有帧缓冲区的命令包装在节点中:

> Node ("webtest") {
>         Wrap ([$ class: 'Xvfb', autoDisplayName: true, 'timeout': 60]) {
>             WithEnv (['DISPLAY =: 0']) {
>                 Echo "Selenium: cluster $ {cluster} - mandantor $ {mandantor} - device $ {device}"
>                 Script {
>                               process = process + "Test Suite"
>                               Def testSuite = config ['mandantor'] [mandantor] [process]
>                               Def specificPropertiesFilename = cluster + '.' + Config ['mandantor'] [mandantor] ['domain'] + '.
>     
>                               cleanupWorkspace ()
>                               CheckoutWebTest (svnUser, svnPassword, mandantor)
>                               GradleSeleniumTest (mandantor, device, testSuite, specificPropertiesFilename)
>                 }
>             }
>         }
>     }

理论上,您还可以在构建环境中将帧缓冲区安装到链接到特定标签的所有节点(此处为“webtest”),但这仅适用于自由式项目而不适用于管道作业 - 因为您没有构建环境。因此,必须在此处设置“autoDisplayName”,以便它知道应该采用哪个帧缓冲区实例。当然,您可以使用自由式包装管道作业,但随后它不再使用Jenkins文件中的参数。