mun*_*ark 3 javascript browserify e2e-testing babeljs cypress
我已将赛普拉斯从更新3.0.3为3.1.3。我正在使用必须与文档相关的ES6导入/导出模块。但是我undefined在终端中出现一行并且在GUI中出现以下错误:
<root_dir>/node_modules/@babel/runtime/helpers/esm/defineProperty.js:1
export default function _defineProperty(obj, key, value) {
^
ParseError: 'import' and 'export' may appear only with 'sourceType: module'
Run Code Online (Sandbox Code Playgroud)
我的测试使用的是普通JS,没有TS os CoffeeScript。我陷入困境,在3.0.3它工作正常。
赛普拉斯在浏览器中运行时,此错误是由诸如“导入”和“导出”之类的现代关键字引起的。与Selenium或Protractor不同-它实际上在浏览器中运行。由于浏览器尚不支持现代JS,因此您需要使用webpack或browserify来转换代码。
https://docs.cypress.io/api/plugins/preprocessors-api.html#Examples
这是一篇很棒的博客文章,介绍如何使用webpack使Cypress与现代JS和Typescript一起使用:https ://glebbahmutov.com/blog/use-typescript-with-cypress/
^^这篇文章的重点是TypeScript,但是Javascript的配置选项将相似。
必须在您的package.json中安装以下npm软件包:
"@cypress/webpack-preprocessor": "^4.1.0",
"cypress": "^3.3.1",
"ts-loader": "^6.0.3",
"typescript": "^3.5.2",
"webpack": "^4.34.0"
Run Code Online (Sandbox Code Playgroud)
Webpack应该使用以下方法安装:
npm install --save-dev webpack typescript ts-loader
npm install --save-dev @cypress/webpack-preprocessor
Run Code Online (Sandbox Code Playgroud)
在根目录中名为tsconfig.json的文件的“ compilerOptions”部分下应显示以下内容,对于非打字稿用户,“ allowJs”设置为true:
"module": "es6",
"target": "es6",
"types": ["cypress"],
"allowJs": true
Run Code Online (Sandbox Code Playgroud)
名为“ webpack.config.js”的文件应存在于您的根目录中,并带有以下内容:
const path = require('path')
module.exports = {
entry: './src/index.ts',
module: {
rules: [
{
test: /\.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/
}
]
},
resolve: {
extensions: ['.tsx', '.ts', '.js']
},
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
}
}
Run Code Online (Sandbox Code Playgroud)
这些导出应位于cypress / plugins / index.js下:
const webpack = require('@cypress/webpack-preprocessor')
module.exports = on => {
const options = {
// send in the options from your webpack.config.js, so it works the same
// as your app's code
webpackOptions: require('../../webpack.config'),
watchOptions: {}
}
on('file:preprocessor', webpack(options))
}
Run Code Online (Sandbox Code Playgroud)
请注意最后一点在赛普拉斯插件文件的末尾,
on('file:preprocessor', webpack(options))
Run Code Online (Sandbox Code Playgroud)
在那里,赛普拉斯被告知以使其可以赛普拉斯可运行的方式处理现代JS代码。
我解决了它,在我的根文件夹中是一个babel.config.js文件,该文件可能会覆盖赛普拉斯的配置。删除后,一切正常。¯\ _(?)_ /¯
更新:
也许babel.config.js基于此问题,使用此内容阅读了魔术:https : //github.com/cypress-io/cypress/issues/2945
module.exports = process.env.CYPRESS_ENV
? {}
: { presets: ['@vue/babel-preset-app'] }
Run Code Online (Sandbox Code Playgroud)
如果人们来这里是为了消息...
ParseError: 'import' 和 'export' 可能只与 'sourceType: module' 一起出现
...在赛普拉斯 TypeScript 项目中。这是答案:
只要您有tsconfig.json文件,赛普拉斯确实支持开箱即用的 TypeScript 。但是,除非您预处理 TypeScript 文件,否则导入不起作用。
以下是步骤:
yarn add -D webpackyarn add -D ts-loaderyarn add -D @cypress/webpack-preprocessor现在,确保您的 Cypress 文件夹中有这 3 个文件tsconfig.json、webpack.config.js和plugins/index.js。
plugins/index.js:
const wp = require("@cypress/webpack-preprocessor");
module.exports = on => {
const options = {
webpackOptions: require("../webpack.config.js")
};
on("file:preprocessor", wp(options));
};
Run Code Online (Sandbox Code Playgroud)
tsconfig.json:
{
"compilerOptions": {
"strict": true,
"target": "es5",
"lib": ["es5", "dom"],
"types": ["cypress"]
},
"include": [
"**/*.ts"
]
}
Run Code Online (Sandbox Code Playgroud)
webpack.config.js:
module.exports = {
mode: 'development',
resolve: {
extensions: ['.ts', '.js']
},
module: {
rules: [
{
test: /\.ts$/,
exclude: [/node_modules/],
use: [
{
loader: 'ts-loader',
options: {
// skip typechecking for speed
transpileOnly: true
}
}
]
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
它现在应该可以工作了。