如何解决Selenium C#使用Firefox时geckodriver.exe被其他进程占用的错误
问题解决步骤
1. 清理残留驱动进程
报错的直接原因是之前测试异常退出导致geckodriver进程驻留,锁定了exe文件。可以执行以下命令强制结束所有相关进程:
taskkill /f /im geckodriver.exe taskkill /f /im chromedriver.exe
也可以打开任务管理器,手动结束所有geckodriver.exe、chromedriver.exe进程。
2. 解决依赖冲突
你当前安装的依赖存在重复冲突:Selenium.Firefox.WebDriver和Selenium.WebDriver.GeckoDriver都是火狐驱动包,同时安装会导致两个包同时释放驱动文件,互相抢占锁定。
请卸载Selenium.Firefox.WebDriver,仅保留以下依赖即可:
- Selenium.WebDriver
- Selenium.WebDriver.ChromeDriver
- Selenium.WebDriver.GeckoDriver
3. 修正驱动生命周期逻辑
你当前的代码存在两个严重问题:
- 直接在类级别实例化驱动,初始化时机不受NUnit生命周期管控
- 没有编写测试结束后的驱动释放逻辑,每次测试跑完驱动进程都会驻留
修正后的代码示例如下:
using NUnit.Framework; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.Firefox; using System; public class BrowserTest { IWebDriver driver; // 如需切换浏览器,修改此处的驱动实例化逻辑即可 [SetUp] public void Initialize() { // 实例化Chrome驱动 driver = new ChromeDriver(); // 实例化Firefox驱动时替换为下面的代码 // driver = new FirefoxDriver(); driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(30); driver.Navigate().GoToUrl("https://www.demo.bnz.co.nz/client/"); driver.Manage().Window.Maximize(); driver.Manage().Cookies.DeleteAllCookies(); } [Test] public void Payees() { System.Threading.Thread.Sleep(10000); //verify if page is loaded IWebElement element = driver.FindElement(By.XPath("//*[@id='left']/div[1]/div/button"));//menu element.Click(); driver.FindElement(By.XPath("//*[@id='left']/div[1]/div/div[3]/section/div[2]/nav[1]/ul/li[3]/a")).Click(); //payes } // 测试结束后自动释放驱动 [TearDown] public void Cleanup() { if (driver != null) { driver.Quit(); driver.Dispose(); } } }
4. 最后验证操作
完成以上修改后,先删除项目下的bin、obj文件夹,重新生成解决方案后再运行测试即可解决报错。
内容的提问来源于stack exchange,提问作者Yorda
相关产品推荐
相关产品推荐

