预先感谢您的帮助。
这个问题似乎在其他地方被问过和回答过,但我相信我已经尝试了所有这些解决方案,但未能取得真正的进展。
我正在尝试为 webdriverIO 创建自定义报告程序。但是,当所有导入都在运行时,我收到以下错误:
<块引用>语法错误:不能在模块外使用导入语句
如果我尝试执行 wdio.conf
文件顶部的 import 语句,我会在 import WebdriverTestrailsReporter
行收到上述错误。我可以通过使用 require 来解决这个问题,但是在 import WDIOReporter from '@wdio/reporter'
上从我的 typescript 类执行导入时遇到相同的错误。
当我尝试将 "type": "module"
添加到我的 package.json 时,我收到一个新错误:
错误[ERR_REQUIRE_ESM]:必须使用import来加载ES模块: /Users/XXXXX/WebstormProjects/integration_test_framework/wdio.conf.local.js 不支持 ES 模块的 require()。要求()的 /Users/XXXXX/WebstormProjects/integration_test_framework/wdio.conf.local.js 从 /Users/XXXXX/WebstormProjects/integration_test_framework/node_modules/@wdio/config/build/lib/ConfigParser.js 是一个 ES 模块文件,因为它是一个 .js 文件,其最近的父文件 package.json 包含“type”:“module”,它定义了所有 .js 文件 该包范围为 ES 模块。而是将 wdio.conf.local.js 重命名为 以 .cjs 结尾,更改需要的代码以使用 import(),或删除 “类型”:“模块”来自 /Users/n1531435/WebstormProjects/integration_test_framework/package.json。
使用 cjs 文件扩展名让我回到开始时的导入错误。我无法更改所需代码,因为它存在于 WDIO ConfigParser
中,而不是我的项目中。
我还对 tsconfig 中的值进行了大量研究,包括目标值(es2015、es2017),但似乎没有任何效果。有什么想法吗?
据我所知,此设置中有 4 个相关文件。我已将它们复制到下面:
wdio
定制的报告器相关文件片段:
wdio.conf.js
//const WebdriverTestrailsReporter = require('./src/test/ui/WebdriverTestrailsReporter.js');
import WebdriverTestrailsReporter from './src/test/ui/WebdriverTestrailsReporter';
var isHeadless = process.env.HEADLESS === 'TRUE';
var useFirefox = process.env.USE_FIREFOX === 'TRUE';
var useChrome = process.env.USE_CHROME ? process.env.USE_CHROME === 'TRUE' : true;
exports.config = {
reporters: ['spec', WebdriverTestrailsReporter]
package.json:
{
"name": REDACTED
"version": "1.1.0",
"description": "",
"main": "index.js",
"bin": {
REDACTED
},
"publishConfig": {
"registry": "https://repo.forge.lmig.com/api/npm/npm-releases/"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@wdio/allure-reporter": "^6.4.7",
"@wdio/cli": "^6.4.5",
"@wdio/local-runner": "^6.4.5",
"@wdio/mocha-framework": "^6.4.0",
"@wdio/sauce-service": "^6.4.6",
"@wdio/spec-reporter": "^6.4.7",
"@wdio/sync": "^6.4.5",
"chromedriver": "^90.0.0",
"fibers": "^5.0.0",
"geckodriver": "^1.20.0",
"husky": "^4.3.0",
"mocha": "^8.1.1",
"prettier": "^2.2.0",
"selenium-webdriver": "^4.0.0-alpha.7",
"wdio-chromedriver-service": "^6.0.4",
"wdio-geckodriver-service": "^1.1.1"
},
"dependencies": {
"@types/chai": "^4.2.12",
"@types/es6-promise": "^3.3.0",
"@types/mocha": "^8.0.2",
"@types/node": "^14.11.5",
"async": "^3.2.0",
"axios": "^0.20.0",
"chai": "^4.2.0",
"date-fns": "^2.16.1",
"execa": "^4.1.0",
"graphql": "^15.3.0",
"graphql-request": "^3.2.0",
"mocha": "^8.1.1",
"sleep": "^6.3.0",
"ts-node": "^9.0.0",
"typescript": "^4.1.2",
"typings": "^2.1.1"
},
"husky": {
"hooks": {
"pre-push": "npm run tsc && npm run prettier"
}
}
}
Reporter(前两行,我们永远不会越过他们)
import WDIOReporter from '@wdio/reporter'
import { TestRailConfig } from '../TestRailConfig';
tsconfig:
{
"compilerOptions": {
"module": "commonjs",
"target": "es6",
"sourceMap": true,
"skipLibCheck": true,
"lib": ["es6"],
"outDir": "lib",
"types": ["node", "@wdio/sync", "@wdio/mocha-framework"]
},
"include": ["src/**/*"],
"exclude": ["node_modules"]
}
答案 0 :(得分:0)
如果您使用 require 则使用该格式的所有内容,否则如果您想使用 import 则添加模块类型并替换所有 require 以导入。
如果您想在某些文件中使用 require 并在某些文件中导入,则将文件重命名为 .cjs,其中包含 require 而不是 .js。请注意,您不能在一个文件中将 ES6 和常见的 js 格式混合在一起。您应该在该文件中使用 require 或 import。
最佳实践是在使用 typescript 时使用 E6,