Geb集成Geckodriver异常:Firefox启动多窗口且无法加载URL
嘿,我来帮你搞定这个Geb+Firefox的坑!你说Chrome跑完全正常,但Firefox启动一堆窗口还不加载URL,结合你的环境配置(Firefox 57.0.4 32位、Geckodriver 0.20.1、Selenium 3.11.0),我梳理了几个大概率的解决方案:
1. 先确认Geckodriver的位数匹配
你用的是32位Firefox,那一定要对应下载32位的Geckodriver!很多人容易顺手下成64位,驱动和浏览器位数不匹配,就会出现这种窗口乱弹、无法正常加载的诡异问题。
2. 修正GebConfig.groovy的Firefox配置方式
你当前的配置只设置了系统属性,但没正确初始化FirefoxDriver的配置选项,Geb需要明确的参数来约束Firefox的行为。试试把你的配置改成这样:
import org.openqa.selenium.firefox.FirefoxDriver import org.openqa.selenium.firefox.FirefoxOptions driver = { // 先指定Geckodriver的完整路径 System.setProperty("webdriver.gecko.driver", "C:\\Data\\selenium\\geckodriver.exe") // 配置Firefox的启动选项,解决多窗口问题 def firefoxOptions = new FirefoxOptions() // 强制Firefox启动时只打开一个窗口,禁用恢复上次会话的特性 firefoxOptions.addArguments("-new-window", "about:blank") // 明确指定32位Firefox的二进制路径(避免系统默认调用64位版本) firefoxOptions.setBinary("C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe") // 初始化驱动并返回 new FirefoxDriver(firefoxOptions) }
如果觉得麻烦,也可以试试Geb更简洁的内置配置方式:
environments { firefox { driver = { System.setProperty("webdriver.gecko.driver", "C:\\Data\\selenium\\geckodriver.exe") def driver = new FirefoxDriver() // 可选:最大化窗口,确保页面加载正常 driver.manage().window().maximize() driver } } }
3. 检查Firefox的默认启动设置
有时候Firefox的默认设置会坑你——比如上次关闭时开了多个标签页/窗口,它会自动恢复。你可以手动打开Firefox,设置“启动时打开空白页”,或者直接在配置里加参数强制它启动空白页(就是上面配置里的-new-window about:blank)。
4. 确认Geckodriver的权限
确保Geckodriver.exe所在的文件夹有读写和执行权限,如果权限不足,驱动没法正常控制浏览器,也会出现窗口异常的情况。
5. 小版本升级试试(可选)
如果上面的方法都没用,考虑小版本升级:比如把Firefox升到59.x(和Geckodriver 0.20.1完全兼容),或者把Geckodriver升到0.21.0(适配Firefox 57-63),有时候一点点版本差异就会导致这类奇怪的bug。
最后,你可以先写个极简的测试脚本验证:
import geb.Browser Browser.drive { go "https://www.google.com" assert title == "Google" }
看看这个简单的脚本能不能正常跑起来,逐步排查问题。
内容的提问来源于stack exchange,提问作者eskoba

