Ubuntu 20.04下使用selenium-webdriver测试时safaridriver报错求助
解决Ubuntu 20.04下Selenium测试报错Safari驱动无法下载的问题
问题原因
你已指定测试仅运行Chrome和Firefox,但Selenium 4+自带的Selenium Manager仍会尝试检测系统中所有可能的浏览器。由于Ubuntu系统不支持Safari,且Safari驱动仅适配macOS,导致驱动下载失败报错。
解决方案
方法1:设置环境变量忽略Safari检测
执行测试命令时添加SE_IGNORE_SAFARI=true环境变量,让Selenium Manager跳过Safari的检测与驱动下载:
SE_IGNORE_SAFARI=true npx mocha test/**/*.spec.cjs
若需长期生效,可将该变量添加到shell配置文件(如~/.bashrc或~/.zshrc):
echo "export SE_IGNORE_SAFARI=true" >> ~/.bashrc source ~/.bashrc
方法2:升级selenium-webdriver到最新版本
部分旧版本的Selenium Manager存在逻辑bug,即使指定了测试浏览器仍会触发Safari检测。运行以下命令升级到最新稳定版:
yarn upgrade selenium-webdriver
方法3:手动指定Chrome/Firefox驱动路径(可选)
若不想依赖Selenium Manager自动管理驱动,可手动下载对应浏览器的驱动(ChromeDriver、GeckoDriver),并在代码中指定路径:
Chrome配置示例:
const { By, Builder, Browser } = require('selenium-webdriver'); const chrome = require('selenium-webdriver/chrome'); const { suite } = require('selenium-webdriver/testing'); const assert = require("assert"); suite(function (env) { describe('First script', function () { let driver; before(async function () { driver = await new Builder() .forBrowser(Browser.CHROME) .setChromeService(new chrome.ServiceBuilder('/usr/local/bin/chromedriver').build()) // 替换为你的ChromeDriver实际路径 .build(); }); after(async () => await driver.quit()); it('First Selenium script', async function () { await driver.get('https://www.selenium.dev/selenium/web/web-form.html'); let title = await driver.getTitle(); assert.strictEqual("Web form", title); await driver.manage().setTimeouts({ implicit: 500 }); let textBox = await driver.findElement(By.name('my-text')); let submitButton = await driver.findElement(By.css('button')); await textBox.sendKeys('Selenium'); await submitButton.click(); let message = await driver.findElement(By.id('message')); let value = await message.getText(); assert.strictEqual("Received!", value); }); }); }, { browsers: [Browser.CHROME, Browser.FIREFOX] });
Firefox配置示例:
const { By, Builder, Browser } = require('selenium-webdriver'); const firefox = require('selenium-webdriver/firefox'); const { suite } = require('selenium-webdriver/testing'); const assert = require("assert"); suite(function (env) { describe('First script', function () { let driver; before(async function () { driver = await new Builder() .forBrowser(Browser.FIREFOX) .setFirefoxService(new firefox.ServiceBuilder('/usr/local/bin/geckodriver').build()) // 替换为你的GeckoDriver实际路径 .build(); }); after(async () => await driver.quit()); it('First Selenium script', async function () { await driver.get('https://www.selenium.dev/selenium/web/web-form.html'); let title = await driver.getTitle(); assert.strictEqual("Web form", title); await driver.manage().setTimeouts({ implicit: 500 }); let textBox = await driver.findElement(By.name('my-text')); let submitButton = await driver.findElement(By.css('button')); await textBox.sendKeys('Selenium'); await submitButton.click(); let message = await driver.findElement(By.id('message')); let value = await message.getText(); assert.strictEqual("Received!", value); }); }); }, { browsers: [Browser.CHROME, Browser.FIREFOX] });
内容的提问来源于stack exchange,提问作者mbourd
相关产品推荐
相关产品推荐

