Node项目中YAML读取dotenv环境变量失败问题求助
问题描述
我使用Cucumber-js在BrowserStack上运行测试,尝试通过dotenv存储凭证并让browserstack.yml读取环境变量。硬编码凭证时项目运行正常,但使用环境变量则抛出「WebDriverError: Invalid username or password」错误。项目仅包含单个feature文件、步骤文件和钩子文件,已在钩子中提前执行dotenv初始化代码,但问题仍未解决。
相关配置如下:
browserstack.yml
userName: ${BROWSERSTACK_USERNAME} accessKey: ${BROWSERSTACK_ACCESS_KEY} platforms: - os: Windows osVersion: 11 browserName: Chrome browserVersion: 115.0 parallelsPerPlatform: 1 browserstackLocal: false buildName: bstack-demo buildIdentifier: ${BUILD_NUMBER} projectName: BrowserStack Sample testObservability: false networkLogs: false consoleLogs: info
.env文件
BROWSERSTACK_USERNAME=thing1 BROWSERSTACK_ACCESS_KEY=thing2
依赖配置(package.json)
{ "devDependencies": { "@cucumber/cucumber": "^9.3.0", "assert": "^2.0.0", "browserstack-node-sdk": "^1.24.2", "dotenv": "^16.3.1", "geckodriver": "^4.1.3" }, "dependencies": { "selenium-webdriver": "^4.10.0" } }
钩子中的dotenv初始化代码
const dotenv = require('dotenv'); dotenv.config();
报错信息
WebDriverError: Invalid username or password at Object.checkLegacyResponse (/Users/user/project/node_modules/selenium-webdriver/lib/error.js:558:15) at parseHttpResponse (/Users/user/project/node_modules/selenium-webdriver/lib/http.js:593:13) at Executor.execute (/Users/user/project/node_modules/selenium-webdriver/lib/http.js:529:28) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) Then a thing - SKIPPED After - PASSED
解决方法
调整dotenv加载时机:BrowserStack Node SDK在启动时就会读取
browserstack.yml,而Cucumber钩子是测试运行阶段才执行的,这时候环境变量还没注入到SDK的上下文里。需要在SDK启动前加载dotenv:
修改package.json中的测试脚本,用node -r dotenv/config预加载dotenv:"scripts": { "test": "node -r dotenv/config node_modules/@cucumber/cucumber/bin/cucumber-js" }或者创建单独的启动脚本(比如
start-test.js):require('dotenv').config(); const { spawn } = require('child_process'); spawn('npx', ['cucumber-js'], { stdio: 'inherit' });然后在
package.json中设置"test": "node start-test.js"。确认.env文件路径:如果你的
.env文件不在项目根目录,需要在dotenv初始化时指定路径:dotenv.config({ path: './your/path/to/.env' });验证环境变量加载情况:在钩子代码中添加日志,确认变量是否被正确读取:
console.log('Username:', process.env.BROWSERSTACK_USERNAME); console.log('Access Key:', process.env.BROWSERSTACK_ACCESS_KEY);如果没有输出正确值,说明dotenv未成功加载。
检查变量名拼写:确保
.env中的变量名和browserstack.yml里的完全一致,注意大小写(比如BROWSERSTACK_USERNAME不能写成小写)。
内容的提问来源于stack exchange,提问作者lacking-cypher
相关产品推荐
相关产品推荐

