如何通过SoapUI的Groovy脚本使用HtmlUnitDriver运行无头浏览器自动化脚本?
你遇到的这个MissingPropertyException其实是版本不兼容导致的,咱们一步步拆解问题和解决方案:
问题根源
你当前使用的是selenium-htmlunit-driver-2.51.0,这个版本对应的HtmlUnit库中,BrowserVersion类并没有CHROME这个通用静态常量。早期的HtmlUnit对Chrome的模拟是按具体浏览器版本号来命名常量的(比如CHROME_60、CHROME_59),CHROME这个简化常量是在后续更高版本的HtmlUnit中才新增的。
可行解决方案
方案1:升级依赖jar包到兼容版本
最简单的解决方式是把selenium-htmlunit-driver升级到支持BrowserVersion.CHROME的版本,比如2.52.0及以上(建议和你的selenium-server-standalone版本尽量匹配,比如用3.141.59版本的selenium-server搭配2.52.0+的htmlunit-driver)。
操作步骤:
- 下载对应版本的
selenium-htmlunit-driverjar包 - 替换SoapUI安装目录
bin/ext下的旧jar文件 - 重启SoapUI,然后重新运行你的原脚本,
BrowserVersion.CHROME就能正常识别了
方案2:使用现有版本支持的Chrome版本常量
如果暂时不想升级jar包,你可以替换成当前版本BrowserVersion类中存在的Chrome具体版本常量。比如在2.51.0版本中,你可以改成:
HtmlUnitDriver driver = new HtmlUnitDriver(BrowserVersion.CHROME_60);
你可以通过查看该版本BrowserVersion的源码或官方API文档,确认具体可用的版本常量名称。
方案3:手动构建Chrome兼容的BrowserVersion实例
如果找不到合适的预定义常量,还可以手动构建一个模拟Chrome的浏览器版本实例:
// 基于现有Chrome版本模板构建自定义实例 BrowserVersion chromeVersion = new BrowserVersion.BrowserVersionBuilder(BrowserVersion.CHROME_60) .setApplicationVersion("60.0.3112.113") // 自定义Chrome版本号 .build(); HtmlUnitDriver driver = new HtmlUnitDriver(chromeVersion);
额外推荐:用ChromeDriver无头模式替代
其实你已经能正常运行ChromeDriver了,完全可以开启Chrome的无头模式来实现无头自动化,这种方式更贴近真实浏览器行为,避免HtmlUnit对某些JS特性兼容不佳的问题。修改后的脚本如下:
import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.By; import java.util.concurrent.TimeUnit; loginApp() public void loginApp() { System.setProperty("webdriver.chrome.driver","D:\\SoapUI-5.2.1\\bin\\ext\\chromedriver.exe") ChromeOptions options = new ChromeOptions(); options.addArguments("--headless"); // 开启无头模式 options.addArguments("--disable-gpu"); // Windows环境下建议添加,避免渲染问题 WebDriver driver = new ChromeDriver(options); driver.setJavascriptEnabled(true); driver.get("MyURL") driver.manage().timeouts().implicitlyWait(120, TimeUnit.SECONDS); driver.findElement(By.id("username")).sendKeys("1234567"); driver.findElement(By.id("password")).sendKeys("1234567"); driver.findElement(By.id("submit")).submit(); driver.manage().timeouts().implicitlyWait(120, TimeUnit.SECONDS); log.info("Page title is: " + driver.getTitle()); }
注意事项
- 替换jar包后必须重启SoapUI,确保新的类文件被加载
- 保持selenium相关jar包版本一致,避免依赖冲突
- 如果选择HtmlUnitDriver,注意它对复杂JS页面的兼容性可能不如真实Chrome
内容的提问来源于stack exchange,提问作者Karunagara

