首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用selenium/chromedriver在码头上运行时,夜光测试失败

使用selenium/chromedriver在码头上运行时,夜光测试失败
EN

Stack Overflow用户
提问于 2022-06-17 21:34:37
回答 1查看 122关注 0票数 1

我正在使用docker编写运行我的整个系统,并且我试图使用同一网络中的selenium/chrome服务执行我的端到端测试(用Nightwatch编写)。我的前端是VueJS,图像是从一个节点基映像构建的。我正在使用docker-compose exec前端npm运行test-selenium来运行测试,并获得以下输出:

代码语言:javascript
复制
> frontend@0.1.0 test-selenium
> nightwatch -c nightwatch-selenium.conf.js


[Login Test] Test Suite
──────────────────────────────────────────────
ℹ Connected to chrome on port 4444 (1494ms).
  Using: chrome (102.0.5005.61) on LINUX.   


  Running login:
───────────────────────────────────────────────────────────────────────────────────────────────────
  ℹ Loaded url http://frontend:8090/login in 2049ms
  NoSuchElementError: An error occurred while running .click() command on <Element [name=@loginBt]>: Timed out while waiting for element "#loginBt" with "css selector" to be present for 5000 milliseconds.
       at Object.login (/app/tests/loginTest.js:8:8)
  NoSuchElementError: An error occurred while running .setValue() command on <Element [name=@emailField]>: Timed out while waiting for element "input[name = "email"]" with "css selector" to be present for 5000 milliseconds.
       at Page.fillUpData (/app/tests/page-objects/loginPage.js:13:21)
       at Object.login (/app/tests/loginTest.js:9:8)
  NoSuchElementError: An error occurred while running .setValue() command on <Element [name=@passField]>: Timed out while waiting for element "input[name = "password"]" 
with "css selector" to be present for 5000 milliseconds.
       at Page.fillUpData (/app/tests/page-objects/loginPage.js:13:21)
       at Object.login (/app/tests/loginTest.js:10:8)
  NoSuchElementError: An error occurred while running .click() command on <Element [name=@submitBt]>: Timed out while waiting for element "button[name = "submit"]" with 
"css selector" to be present for 5000 milliseconds.
       at Object.login (/app/tests/loginTest.js:11:8)
  ✖ Testing if the URL contains '/cards' in 5000ms - expected "contains '/cards'" but got: "http://frontend:8090/login" (5143ms)
    at Object.login (/app/tests/loginTest.js:12:15)


FAILED: 1 assertions failed and  4 errors (28.22s)

在本地运行测试时,一切都正常。对于本地测试,我使用安装为dev依赖项的chrome驱动程序,使用http://localhost:8090/.访问前端。

这是我第一次在码头处理E2E测试,所以我不太清楚到底出了什么问题。任何帮助都是非常感谢的。请查找下面的源代码。如果我需要补充更多的信息,请告诉我。

  • package.json

代码语言:javascript
复制
"scripts": {
   ...
    "test": "nightwatch",
    "test-selenium": "nightwatch -c nightwatch-selenium.conf.js",
   ...
  },

  • docker-compose.yml

代码语言:javascript
复制
services:
  frontend:
    build:
      context: card-market-frontend/
      dockerfile: Dockerfile
    command: npm run serve
    working_dir: /app
    ports:
      - "8090:8090"

  chrome:
    image: selenium/standalone-chrome:latest
    hostname: chrome
    privileged: true
    shm_size: 2g  

当使用test-selenium命令运行测试时,我正在使用下面的nightwatch.conf:

代码语言:javascript
复制
const chromedriver = require("chromedriver");

require("dotenv").config();

module.exports = {
  src_folders: ["/tests"],
  page_objects_path: ["tests/page-objects"],

  test_workers: false,

  selenium: {
    start_process: false,

    cli_args: {
      "webdriver.chrome.driver": chromedriver.path,
    },
  },

  webdriver: {
    start_process: false,
  },

  test_settings: {
    default: {
      selenium_port: 4444,
      selenium_host: "chrome",

      screenshots: {
        enabled: true,
        path: "tests_output/",
        on_failure: true,
      },

      desiredCapabilities: {
        browserName: "chrome",
        chromeOptions: {
          w3c: false,
          args: ["--no-sandbox"],
        },
      },
    },
  },
};

我的页面对象loginPage.js

代码语言:javascript
复制
module.exports = {
  url: `http://frontend:8090/login`,
  elements: {
    logoutBt: "#logoutBt",
    loginBt: "#loginBt",
    emailField: 'input[name = "email"]',
    passField: 'input[name = "password"]',
    submitBt: 'button[name = "submit"]',
  },
  commands: [
    {
      fillUpData(selector, data) {
        return this.setValue(selector, data);
      },
    },
  ],
};

运行loginTest.js的测试

代码语言:javascript
复制
module.exports = {
  login(browser) {
    const page = browser.page.loginPage();
    const email = "coolEmail@gmail.com";
    const pass = "coolPass";
    page
      .navigate()
      .click("@loginBt")
      .fillUpData("@emailField", email)
      .fillUpData("@passField", pass)
      .click("@submitBt")
      .assert.urlContains("/cards");
  },
};
EN

回答 1

Stack Overflow用户

发布于 2022-06-17 22:48:20

您的第一个错误是:

代码语言:javascript
复制
NoSuchElementError: An error occurred while running .click() command on <Element [name=@logoutBt]>: Timed out while waiting for element "#logoutBt" with "css selector" to be present for 5000 milliseconds.

这表示在搜索Logout按钮时引发了。

但是,按照loginTest.js中的测试步骤,理想情况下,您不应该在导航到页面后才找到Logout按钮:

代码语言:javascript
复制
.navigate()
.click("@logoutBt")

只有在登录后才能找到注销按钮。

解决方案

理想情况下,命令的顺序是:

代码语言:javascript
复制
page
  .navigate()
  .click("@loginBt")
  .fillUpData("@emailField", email)
  .fillUpData("@passField", pass)
  .click("@submitBt")
  .assert.urlContains("/cards");
  .click("@logoutBt")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72664999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档