gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:00:16 25 4
gpt4 key购买 nike

我正在将 Docker 从机与 jenkins 一起使用,并使用 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 管道,因此测试在从属设备上运行,对于从属设备,这里的信息很少:

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

Display options ENV DEBIAN_FRONTEND noninteractive ENV DEBCONF_NONINTERACTIVE_SEEN true

ENV SCREEN_WIDTH 1360 ENV SCREEN_HEIGHT 1020 ENV SCREEN_DEPTH 24 ENV DISPLAY :99.0 RUN mkdir -p /opt/chromedriver-$CHROMEDRIVER_VERSION \ && curl -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 \ && rm /tmp/chromedriver_linux64.zip \ && chmod +x /opt/chromedriver-$CHROMEDRIVER_VERSION/chromedriver \ && ln -fs /opt/chromedriver-$CHROMEDRIVER_VERSION/chromedriver /usr/local/bin/chromedriver

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

最佳答案

我找到了解决方案。1.问题:Chrome及其沙箱正如我们所知,Chrome 将所有“选项卡”包装在一个沙箱中,并有自己的进程等等。我不知道的是Chrome使用unix虚拟化工具。 docker 容器内不允许使用的工具。“简单”的解决方案将使用 -privilegedged 启动容器,这当然是不合适的,或者为容器分配“SYS_ADMIN”功能 - 同样令人不快。我现在在 Webtest 驱动程序工厂、Chrome 沙箱中所做的事情已经习惯了:

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

所以 Chrome 开始至少多一μ。2.接下来的问题是宿主主机中缺少X服务器。为此,您必须使用某种形式的屏幕缓冲区,因为 Chrome 必须与显示器连接。您也许还可以使用 xhost local: root 等将 dockercontainer 与 dockerhost 的显示连接起来,但我没有运行。Selenium 在其 NodeBase 中通过使用 xvfb(虚拟帧缓冲区)包装它来实现此目的。

> 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 文件中的参数工作。

关于java - 在 jenkins 中使用 Docker 从站时,Selenium 驱动程序崩溃并给出 NoSuchSessionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44034091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com