JMeter中Selenium WebDriver采样器执行异常及报错求助
JMeter中Selenium WebDriver代码执行问题排查与解决
你在JMeter中使用Selenium WebDriver代码时遇到以下问题:
- 未生成指定的日志文件
System.out.println语句无输出- 报错
ERROR c.g.j.p.w.s.WebDriverSampler: unknown protocol: data
你提供的代码如下:
package com.jmeter.test.scripts; import java.io.File; import org.testng.annotations.Test; import org.openqa.selenium.WebDriver; import org.openqa.selenium.OutputType; import org.apache.commons.io.FileUtils; import org.openqa.selenium.TakesScreenshot; @Test public class SnapScreenshot { String fileName = UUID.randomUUID.toString(); public static void main(String[] args) { System.setProperty("webdriver.chrome.driver", "C:\\Apache\\apache-jmeter-5.5\\Drivers\\Chrome\\109\\chromedriver.exe"); System.setProperty("webdriver.chrome.logfile", "C:\\Temp\\driverlog.log"); System.setProperty("webdriver.chrome.verboseLogging", "true"); WebDriver driver = new ChromeDriver(); driver.manage().window().maximize(); driver.manage().timeouts().pageLoadTimeout(40, TimeUnit.SECONDS); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); driver.get("https://www.google.com/"); Thread.sleep(5000); File srcFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); File destFile = new File("C:\\temp\\screenshots\\" + fileName + ".png"); try { FileUtils.copyFile(srcFile, destFile); } catch (Exception ex) { ex.printStackTrace(); } finally { driver.quit(); } } }
以下是针对性的解决方法:
问题1:未生成指定的日志文件
原因
- 你已通过
jp@gc - Chrome Driver Config配置驱动,再用System.setProperty重复设置驱动及日志属性会导致冲突,配置元件的优先级更高。 - 日志目标目录(如
C:\Temp)可能不存在,Chrome不会自动创建目录。
解决
- 删除代码中
System.setProperty("webdriver.chrome.driver", "...")这一行,避免和配置元件冲突。 - 在
jp@gc - Chrome Driver Config的Additional Command Line Arguments中添加日志参数:--log-path=C:\Temp\driverlog.log --verbose-logging - 手动创建
C:\Temp目录,确保Chrome有权限写入该路径。
问题2:System.out.println无输出
原因
- JMeter的WebDriver Sampler不会直接输出
System.out内容到控制台,且你代码中的main方法在JMeter环境下不会被执行。
解决
- 替换
System.out.println为JMeter官方日志API,输出内容会写入jmeter.log文件或在JMeter日志面板显示:WDS.log.info("你的输出内容"); - 移除代码中的
main方法,JMeter WebDriver Sampler直接执行脚本逻辑,无需入口方法。
问题3:报错unknown protocol: data
原因
- 代码结构不符合JMeter WebDriver Sampler要求:使用了
package、@Test注解和main方法,且手动初始化ChromeDriver与配置元件的驱动实例冲突。 - 缺失必要的类导入(如
UUID、ChromeDriver、TimeUnit),导致执行异常。
解决
- 去掉代码中的
package、@Test和main方法,按照JMeter WebDriver Sampler的Groovy脚本规范编写逻辑。 - 使用配置元件提供的
WDS.browser实例,无需手动创建ChromeDriver。 - 补充所有缺失的导入类。
修正后的完整代码(适用于JMeter WebDriver Sampler)
import java.io.File; import java.util.UUID; import java.util.concurrent.TimeUnit; import org.apache.commons.io.FileUtils; import org.openqa.selenium.OutputType; import org.openqa.selenium.TakesScreenshot; // 生成随机文件名 String fileName = UUID.randomUUID().toString(); // 使用配置元件初始化的浏览器实例 WDS.browser.manage().window().maximize(); WDS.browser.manage().timeouts().pageLoadTimeout(40, TimeUnit.SECONDS); WDS.browser.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); WDS.browser.get("https://www.google.com/"); WDS.log.info("页面加载完成,等待5秒"); Thread.sleep(5000); // 确保截图目录存在 File destFile = new File("C:\\temp\\screenshots\\" + fileName + ".png"); destFile.getParentFile().mkdirs(); // 截图并保存 try { File srcFile = ((TakesScreenshot) WDS.browser).getScreenshotAs(OutputType.FILE); FileUtils.copyFile(srcFile, destFile); WDS.log.info("截图已保存至:" + destFile.getAbsolutePath()); } catch (Exception ex) { WDS.log.error("截图保存失败", ex); } finally { WDS.browser.quit(); }
关键注意事项
- 确保
jp@gc - Chrome Driver Config中配置的ChromeDriver版本与本地Chrome浏览器版本完全匹配。 - 若使用JMeter 5.5及以上版本,建议使用Groovy作为脚本语言,避免Java语法兼容问题。
- 执行前确认
C:\temp\screenshots目录存在,或依赖代码中destFile.getParentFile().mkdirs()自动创建目录。
内容的提问来源于stack exchange,提问作者user4654707
相关产品推荐
相关产品推荐

