我已经创建了一个docker映像,它将所有的jmeter包和lib打包在一起,并且我能够在我的运行容器中调用其他一些jmeter测试用例。
但对于一个特殊的硒jmeter测试用例,它需要chrome在无头模式下运行,它失败了,因为chrome没有启动(?)
以下是我的软件包版本:
jmeter: 5.6.2
selenium-plugin on jmeter: 4.13
google-chrome: 120.0.6099.109
chrome-driver: 120.0.6099.109
我查看了jmeter日志,其中写道:
2024-01-10 16:50:36,994 ERROR o.a.j.t.JMeterThread: Error calling threadStarted
org.openqa.selenium.SessionNotCreatedException: Could not start a new session. Response code 500. Message: session not created: Chrome failed to start: exited normally.
(session not created: DevToolsActivePort file doesn't exist)
(The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
Host info: host: 'aac0c7996ca3', ip: '172.17.0.2'
Build info: version: '4.13.0', revision: 'ba948ece5b*'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '5.4.0-166-generic', java.version: '1.8.0_392'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Command: [null, newSession {capabilities=[Capabilities {acceptInsecureCerts: true, browserName: chrome, goog:chromeOptions: {args: [--remote-allow-origins=*, --start-maximized, --headless=new], binary: /usr/bin/google-chrome, extensions: []}, proxy: Proxy(system)}]}]
at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:140) ~[selenium-remote-driver-4.13.0.jar:?]
我在谷歌上搜索了这个问题,有人建议用这样的选项启动chrome:
--disable-dev-shm-usage
我有可能在jmeter项目中提供我的谷歌chrome的位置以及运行选项吗?
谢谢
杰克
更新(01/11/2024)。
感谢您的投入。我已经使用了你的dockerfile,并进行了一些调整和尝试,但结果保持不变。
Dockefile:
FROM ubuntu:22.04
ARG JMETER_VERSION="5.6.2"
ENV JMETER_HOME /opt/apache-jmeter-${JMETER_VERSION}
ENV JMETER_BIN ${JMETER_HOME}/bin
RUN apt update && apt upgrade -y \
&& apt install wget curl gnupg unzip -y \
&& wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
&& sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \
&& apt update
RUN apt install google-chrome-stable openjdk-8-jdk-headless -y
RUN mkdir /tmp/dependencies
RUN mkdir -p /opt
RUN curl -L --silent https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-5.6.2.tgz > /tmp/dependencies/apache-jmeter-5.6.2.tgz
RUN tar -xzf /tmp/dependencies/apache-jmeter-5.6.2.tgz -C /opt
RUN curl -L --silent https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/120.0.6099.109/linux64/chrome-linux64.zip > /tmp/dependencies/chrome-linux64.zip
RUN unzip /tmp/dependencies/chrome-linux64.zip
RUN mv chrome-linux64/chrome /usr/bin/google-chrome
RUN rm -rf /tmp/dependencies
WORKDIR ${JMETER_BIN}
RUN wget -q https://jmeter-plugins.org/get/ -O ../lib/ext/jmeter-plugins-manager.jar
RUN wget -q https://repo1.maven.org/maven2/kg/apc/cmdrunner/2.3/cmdrunner-2.3.jar -P ../lib/
RUN java -cp ../lib/ext/jmeter-plugins-manager.jar org.jmeterplugins.repository.PluginManagerCMDInstaller
RUN ./PluginsManagerCMD.sh install jpgc-webdriver
RUN google-chrome --sandbox --version
RUN wget -q https://chromedriver.storage.googleapis.com/$(google-chrome --sandbox --version | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+')/chromedriver_linux64.zip || wget https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/$(google-chrome --sandbox --version | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+')/linux64/chromedriver-linux64.zip
RUN unzip -j chromedriver-linux64.zip chromedriver-linux64/chromedriver chromedriver || true
# Set global PATH such that "jmeter" command is found
ENV PATH $PATH:$JMETER_BIN:$JMETER_HOME:/usr/bin
# Entrypoint has same signature as "jmeter" command
COPY entrypoint.sh /
WORKDIR ${JMETER_HOME}
ENTRYPOINT ["/entrypoint.sh"]
这是我的构建命令:
docker构建--构建arg JMETER_VERSION=5.6.2--构建arg-t“Jack/JMETER:最新”
我把它标记为:
docker tag Jack/jmeter jmeter
这是我非常基本的“testing.jmx”案例,
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.6.2">
<hashTree>
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="FTM-Random-Mixed-testing" enabled="true">
<boolProp name="TestPlan.functional_mode">false</boolProp>
<boolProp name="TestPlan.tearDown_on_shutdown">false</boolProp>
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabl
ed="true">
<collectionProp name="Arguments.arguments">
<elementProp name="index" elementType="Argument">
<stringProp name="Argument.name">index</stringProp>
<stringProp name="Argument.value">0</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</elementProp>
</TestPlan>
<hashTree>
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="GUI-Group" enabled="true">
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" en
abled="true">
<stringProp name="LoopController.loops">1</stringProp>
<boolProp name="LoopController.continue_forever">false</boolProp>
</elementProp>
<stringProp name="ThreadGroup.num_threads">1</stringProp>
<stringProp name="ThreadGroup.ramp_time">1</stringProp>
<boolProp name="ThreadGroup.delayedStart">false</boolProp>
<boolProp name="ThreadGroup.scheduler">false</boolProp>
<stringProp name="ThreadGroup.duration"></stringProp>
<stringProp name="ThreadGroup.delay"></stringProp>
<boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
</ThreadGroup>
<hashTree>
<com.googlecode.jmeter.plugins.webdriver.sampler.WebDriverSampler guiclass="com.googlecode.jmeter.plugins.webdriver.sampler.gui.WebDriverSamplerGui" testclass="c
om.googlecode.jmeter.plugins.webdriver.sampler.WebDriverSampler" testname="jp@gc - WebDriver Sampler" enabled="true">
<stringProp name="WebDriverSampler.script">WDS.sampleResult.sampleStart()
WDS.browser.get('http://jmeter-plugins.org')
WDS.sampleResult.sampleEnd()
</stringProp>
<stringProp name="WebDriverSampler.parameters"></stringProp>
<stringProp name="WebDriverSampler.language">groovy</stringProp>
</com.googlecode.jmeter.plugins.webdriver.sampler.WebDriverSampler>
<hashTree/>
<com.googlecode.jmeter.plugins.webdriver.config.ChromeDriverConfig guiclass="com.googlecode.jmeter.plugins.webdriver.config.gui.ChromeDriverConfigGui" testclass=
"com.googlecode.jmeter.plugins.webdriver.config.ChromeDriverConfig" testname="jp@gc - Chrome Driver Config" enabled="true">
<boolProp name="WebDriverConfig.acceptinsecurecerts">true</boolProp>
<boolProp name="WebDriverConfig.reset_per_iteration">false</boolProp>
<stringProp name="WebDriverConfig.driver_path">/opt/apache-jmeter-5.6.2/bin/chromedriver</stringProp>
<boolProp name="WebDriverConfig.dev_mode">false</boolProp>
<boolProp name="WebDriverConfig.headless">false</boolProp>
<boolProp name="WebDriverConfig.maximize_browser">false</boolProp>
<stringProp name="ChromeDriverConfig.additional_args"></stringProp>
<stringProp name="ChromeDriverConfig.binary_path">/opt/google/chrome/google-chrome</stringProp>
<stringProp name="WebDriverConfig.proxy_type">SYSTEM</stringProp>
<stringProp name="WebDriverConfig.proxy_pac_url"></stringProp>
<stringProp name="WebDriverConfig.http_host"></stringProp>
<intProp name="WebDriverConfig.http_port">8080</intProp>
<boolProp name="WebDriverConfig.use_http_for_all_protocols">true</boolProp>
<stringProp name="WebDriverConfig.https_host"></stringProp>
<intProp name="WebDriverConfig.https_port">8080</intProp>
<stringProp name="WebDriverConfig.ftp_host"></stringProp>
<intProp name="WebDriverConfig.ftp_port">8080</intProp>
<stringProp name="WebDriverConfig.socks_host"></stringProp>
<intProp name="WebDriverConfig.socks_port">8080</intProp>
<stringProp name="WebDriverConfig.no_proxy">localhost</stringProp>
<stringProp name="WebDriverConfig.custom_capabilites"></stringProp>
</com.googlecode.jmeter.plugins.webdriver.config.ChromeDriverConfig>
<hashTree/>
</hashTree>
</hashTree>
</hashTree>
</jmeterTestPlan>
chji@avocado:~/docker-jmeter$ cat ~/jmeter/tcs/testing.jmx
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.6.2">
<hashTree>
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="FTM-Random-Mixed-testing" enabled="true">
<boolProp name="TestPlan.functional_mode">false</boolProp>
<boolProp name="TestPlan.tearDown_on_shutdown">false</boolProp>
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="index" elementType="Argument">
<stringProp name="Argument.name">index</stringProp>
<stringProp name="Argument.value">0</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</elementProp>
</TestPlan>
<hashTree>
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="GUI-Group" enabled="true">
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
<stringProp name="LoopController.loops">1</stringProp>
<boolProp name="LoopController.continue_forever">false</boolProp>
</elementProp>
<stringProp name="ThreadGroup.num_threads">1</stringProp>
<stringProp name="ThreadGroup.ramp_time">1</stringProp>
<boolProp name="ThreadGroup.delayedStart">false</boolProp>
<boolProp name="ThreadGroup.scheduler">false</boolProp>
<stringProp name="ThreadGroup.duration"></stringProp>
<stringProp name="ThreadGroup.delay"></stringProp>
<boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
</ThreadGroup>
<hashTree>
<com.googlecode.jmeter.plugins.webdriver.sampler.WebDriverSampler guiclass="com.googlecode.jmeter.plugins.webdriver.sampler.gui.WebDriverSamplerGui" testclass="com.googlecode.jmeter.plugins.webdriver.sampler.WebDriverSampler" testname="jp@gc - WebDriver Sampler" enabled="true">
<stringProp name="WebDriverSampler.script">WDS.sampleResult.sampleStart()
WDS.browser.get('http://jmeter-plugins.org')
WDS.sampleResult.sampleEnd()
</stringProp>
<stringProp name="WebDriverSampler.parameters"></stringProp>
<stringProp name="WebDriverSampler.language">groovy</stringProp>
</com.googlecode.jmeter.plugins.webdriver.sampler.WebDriverSampler>
<hashTree/>
<com.googlecode.jmeter.plugins.webdriver.config.ChromeDriverConfig guiclass="com.googlecode.jmeter.plugins.webdriver.config.gui.ChromeDriverConfigGui" testclass="com.googlecode.jmeter.plugins.webdriver.config.ChromeDriverConfig" testname="jp@gc - Chrome Driver Config" enabled="true">
<boolProp name="WebDriverConfig.acceptinsecurecerts">true</boolProp>
<boolProp name="WebDriverConfig.reset_per_iteration">false</boolProp>
<stringProp name="WebDriverConfig.driver_path">/opt/apache-jmeter-5.6.2/bin/chromedriver</stringProp>
<boolProp name="WebDriverConfig.dev_mode">false</boolProp>
<boolProp name="WebDriverConfig.headless">false</boolProp>
<boolProp name="WebDriverConfig.maximize_browser">false</boolProp>
<stringProp name="ChromeDriverConfig.additional_args"></stringProp>
<stringProp name="ChromeDriverConfig.binary_path">/opt/google/chrome/google-chrome</stringProp>
<stringProp name="WebDriverConfig.proxy_type">SYSTEM</stringProp>
<stringProp name="WebDriverConfig.proxy_pac_url"></stringProp>
<stringProp name="WebDriverConfig.http_host"></stringProp>
<intProp name="WebDriverConfig.http_port">8080</intProp>
<boolProp name="WebDriverConfig.use_http_for_all_protocols">true</boolProp>
<stringProp name="WebDriverConfig.https_host"></stringProp>
<intProp name="WebDriverConfig.https_port">8080</intProp>
<stringProp name="WebDriverConfig.ftp_host"></stringProp>
<intProp name="WebDriverConfig.ftp_port">8080</intProp>
<stringProp name="WebDriverConfig.socks_host"></stringProp>
<intProp name="WebDriverConfig.socks_port">8080</intProp>
<stringProp name="WebDriverConfig.no_proxy">localhost</stringProp>
<stringProp name="WebDriverConfig.custom_capabilites"></stringProp>
</com.googlecode.jmeter.plugins.webdriver.config.ChromeDriverConfig>
<hashTree/>
</hashTree>
</hashTree>
</hashTree>
</jmeterTestPlan>
,它位于我的本地服务器上。正如你可能会发现的,我已经在这个测试案例中调整了chromdriver和chrome值。
这是我执行测试用例的命令。
docker run --dns="10.160.83.102" --mount type=bind,source="~/testcaseDir",target="/opt/testcases" jmeter -n -t /opt/testcases/testing.jmx -l /tmp/runtime.jtl -j /tmp/runtime.log -o /opt/web-output
在我的情况下,为了访问我的网站,我需要提供我的DNS服务器。
谢谢你的帮助。
杰克