电子 webpack 问题与 selenium-webdriver [bazel-genfiles]

abh*_*ake 5 node.js selenium-webdriver webpack bazel electron

对于我的电子应用程序项目(使用的样板),我想使用selenium-webdriverchromedriver执行一些 selenium 节点命令。

问题是,当我添加模块时selenium-webdriver,我的应用程序突然在终端和控制台中抛出错误和警告。


终端警告:

WARNING in ./node_modules/selenium-webdriver/lib/http.js 49:11-26
Critical dependency: the request of a dependency is an expression
 @ ./node_modules/selenium-webdriver/http/index.js
 @ ./node_modules/selenium-webdriver/index.js
 @ ./src/components/playback.js
 @ ./src/components/App.js
 @ ./src/index.js

WARNING in ./node_modules/selenium-webdriver/lib/http.js
Module not found: Error: Can't resolve '../../../../bazel-genfiles' in
'<MY_LOCAL_DIR>/electron-react-webpack-boilerplate/node_modules/selenium-webdriver/lib'
 @ ./node_modules/selenium-webdriver/lib/http.js
 @ ./node_modules/selenium-webdriver/http/index.js
 @ ./node_modules/selenium-webdriver/index.js
 @ ./src/components/playback.js
 @ ./src/components/App.js
 @ ./src/index.js
Run Code Online (Sandbox Code Playgroud)

应用程序错误:

Error: Cannot find module 'undefined'
    at webpackMissingModule (http.js:53)
    at requireAtom (http.js:53)
    at Object../node_modules/selenium-webdriver/lib/http.js (http.js:35)
    at __webpack_require__ (bootstrap:685)
    at fn (bootstrap:59)
    at Object../node_modules/selenium-webdriver/http/index.js (index.js:29)
    at __webpack_require__ (bootstrap:685)
    at fn (bootstrap:59)
    at Object../node_modules/selenium-webdriver/index.js (index.js:25)
    at __webpack_require__ (bootstrap:685)

Uncaught Error: Failed to import atoms module ./atoms/get-attribute.js. 
If running in dev mode, you need to run
`bazel build //javascript/node/selenium-webdriver/lib/atoms:get-attribute.js`
from the projectroot: Error: Cannot find module './atoms/get-attribute.js'
    at requireAtom (http.js:56)
    at Object../node_modules/selenium-webdriver/lib/http.js (http.js:35)
    at __webpack_require__ (bootstrap:685)
    at fn (bootstrap:59)
    at Object../node_modules/selenium-webdriver/http/index.js (index.js:29)
    at __webpack_require__ (bootstrap:685)
    at fn (bootstrap:59)
    at Object../node_modules/selenium-webdriver/index.js (index.js:25)
    at __webpack_require__ (bootstrap:685)
    at fn (bootstrap:59)
Run Code Online (Sandbox Code Playgroud)

这个问题是因为 webpack 才发生的,因为我能够从电子快速启动代码中执行两个所需的库


webpack 配置如下:

const webpack = require('webpack')
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { spawn } = require('child_process')

const defaultInclude = path.resolve(__dirname, 'src')

module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/i,
        use: ['style-loader', 'css-loader'],
      },
      {
        test: /\.(png|jpe?g|gif|svg|eot|ttf|woff|woff2)$/,
        loader: 'url-loader',
        options: {
          limit: 8192,
        },
      },
      {
        test: /\.(js|jsx)$/,
        loader: "babel-loader",
        exclude: /node_modules/
      },
      {
        test: /\.(jpe?g|png|gif)$/,
        use: [{ loader: 'file-loader?name=img/[name]__[hash:base64:5].[ext]' }],
        include: defaultInclude
      }
    ]
  },
  target: 'node',
  plugins: [
    new HtmlWebpackPlugin(),
    new webpack.DefinePlugin({
      'process.env.NODE_ENV': JSON.stringify('development')
    })
  ],
  devtool: 'cheap-source-map',
  devServer: {
    contentBase: path.resolve(__dirname, 'dist'),
    stats: {
      colors: true,
      chunks: false,
      children: false
    },
    before() {
      spawn(
        'electron',
        ['.'],
        { shell: true, env: process.env, stdio: 'inherit' }
      )
      .on('close', code => process.exit(0))
      .on('error', spawnError => console.error(spawnError))
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Ber*_*ğlu 0

该问题似乎与 Webpack 配置有关,警告消息表明存在一些无法解决的关键依赖项。您可以尝试在Webpack配置中添加以下代码来解决该问题:

node: {
  __dirname: true,
  __filename: true,
},
Run Code Online (Sandbox Code Playgroud)

这应该修复与请求依赖项为表达式相关的关键依赖项警告。

关于缺少模块的错误,似乎存在一些与 Selenium Webdriver 使用的 Bazel 构建系统相关的问题。一种解决方法是使用以下命令手动构建所需的模块:

bazel build /javascript/node/selenium-webdriver/lib/atoms:get-attribute.js
Run Code Online (Sandbox Code Playgroud)

这应该在 bazel-bin 目录中创建缺少的模块,然后您可以将其复制到项目的 node_modules 目录中的适当位置。

另一种可能的解决方案是尝试使用不存在这些问题的不同版本的 Selenium Webdriver。您可以查看不同版本的发行说明,看看它们是否提到了与 Bazel 或 Webpack 相关的问题。您可以使用 npm 安装特定版本的 Selenium Webdriver,如下所示:

npm install selenium-webdriver@3.141.0
Run Code Online (Sandbox Code Playgroud)

3.141.0替换为您要使用的版本号。