Cypress(Electron)在端到端测试期间在OpenShift上出现错误“无法获取'appData'路径”

cngwdvgl  于 2023-09-28  发布在  Electron
关注(0)|答案(4)|浏览(175)

我尝试在OpenShift中运行Cypress端到端测试。它在本地工作,但在OpenShift中,通过cypress run命令启动测试后会发生错误。
OpenShift中的错误消息

> [email protected] cypress-run /e2e  
    A JavaScript error occurred in the main process
    Uncaught Exception:
    Error: Failed to get 'appData' path
        at App.app._setDefaultAppPaths (/e2e/cypress-cache/3.6.0/Cypress/resources/electron.asar/browser/api/app.js:51:41)
        at Object.<anonymous> (/e2e/cypress-cache/3.6.0/Cypress/resources/electron.asar/browser/init.js:147:5)
        at Module._compile (internal/modules/cjs/loader.js:839:30)
        at Object.Module._extensions..js (internal/modules/cjs/loader.js:851:10)
        at Module.load (internal/modules/cjs/loader.js:701:32)
        at tryModuleLoad (internal/modules/cjs/loader.js:633:12)
        at Function.Module._load (internal/modules/cjs/loader.js:625:3)
        at Function.Module.runMain (internal/modules/cjs/loader.js:904:10)
        at internal/main/run_main_module.js:24:11

如果我尝试在docker镜像构建期间运行测试(RUN npm run cypress-run),一切正常。cypress-runnpm脚本只是“cypress run”的快捷方式。如果我在容器启动后尝试运行测试(ENTRYPOINT ["/usr/local/bin/npm”,“run”,“cypress-run”]),则会发生错误。
它发生在Cypress实现的电子部分。我认为问题在于,Docker镜像构建是由root用户执行的。该容器将由其他用户启动。似乎electron在安装cypress期间将appData路径设置为root用户的目录。稍后,正在启动容器并运行测试的用户将无法访问此appData文件夹。
我对电子不是很熟悉。也许有人知道如何迫使电子创建这个appData文件夹在其他地方?

lnxxn5zx

lnxxn5zx1#

您还可以将appData路径设置为用户可以通过环境变量XDG_CONFIG_HOME控制的目录。
(来源:app.getPath的电子文档)

hwamh0ep

hwamh0ep2#

我找到了两个解决问题的方法:

1)使用电子浏览器运行cypress:

在dockerfile中,我将electron.asar替换为修改后的版本

RUN rm -f /e2e/cypress-cache/3.6.0/Cypress/resources/electron.asar
COPY custom-electron-version/electron.asar /e2e/cypress-cache/3.6.0/Cypress/resources/

在修改后的electron.asar中,在初始化的js文件中更改了appData路径:app.setPath("appData", 'customPath')
它不是一个干净的解决方案和一个问题,对每一个更新!

2)在Chrome浏览器中运行cypress

更好的解决方案是将浏览器更改为Chrome:

cypress run --browser chrome

有了Chrome,一切都能按预期工作,没有肮脏的变通方法:)

nhn9ugyo

nhn9ugyo3#

在cypress的openshift部署上设置以下环境变量对我来说很有用。

  • XDG_CONFIG_HOME=/test
  • /test应包含cypress.json文件
  • CYPRESS_PORT=8080

我发现了CYPRESS_PORT问题,在手动将XDG_CONFIG_HOME设置为/test后,在终端中运行cypress run。我在终端运行export XDG_CONFIG_HOME=/test)并得到以下错误。

We found an invalid configuration value:

Expected `port` to be a number. Instead the value was: `"tcp://10.201.209.161:8080"`

然后运行cypress info并查找设置为tcp://10.201.209.161:8080的环境变量。

Environment Variables:
CYPRESS_SERVICE_HOST: 10.201.209.161
CYPRESS_PORT_8080_TCP_ADDR: 10.201.209.161
CYPRESS_PORT_8080_TCP_PORT: 8080
CYPRESS_PORT_8080_TCP_PROTO: tcp
CYPRESS_SERVICE_PORT: 8080
CYPRESS_PORT: tcp://10.201.209.161:8080         <----------
CYPRESS_SERVICE_PORT_8080_TCP: 8080
CYPRESS_PORT_8080_TCP: tcp://10.201.209.161:8080
CYPRESS_CACHE_FOLDER: /root/.cache/Cypress

然后我试着运行export CYPRESS_PORT=8080,然后运行cypress run,它工作了!

mspsb9vt

mspsb9vt4#

在我的例子中,当我试图切换到user而不是root时,出现了这个问题。因此,Electron试图获取home文件夹的路径。简单地添加一个新用户并没有帮助。
在我添加了主目录后,它开始工作了。

RUN useradd -m user
USER user

ENTRYPOINT [path]

相关问题