Webdriver IO 测试给出错误:运行循环 ci 管道时无法创建会话

问题描述 投票:0回答:1

我是浏览器测试自动化的新手,我在 webdriverIO 中有两个测试用例,它们在本地运行良好,但是当我尝试通过 Circle CI 运行它们时,出现以下错误

我是否必须通过 npm 安装 selenium 独立服务器 docker 映像,然后在我的 config.yml 文件中调用它才能运行我的测试? 我是否必须使用 localhost 更新我的 wdio 文件??

以下是清晰查看的文件。

Config.yaml 文件

version: 2.1
jobs:
  build:
    docker:
      - image: circleci/node:latest
      - image: selenium/node-chrome

    working_directory: ~/repo

    steps:
      - checkout
      - run:
          name: Make Report Directory
          command: mkdir report
      - run:
          command: npm cache clean --force
      - run:
          command: npm install --package-lock-only
      - run:
          name: Install WDIO Packages
          command: npm install webdriverio @wdio/cli @wdio/local-runner @wdio/spec-reporter --save-dev
          
      

      - run:
          name: Test
          command: npm run wdio
      - store_test_results:
          path: report

workflows:
  version: 2
  build:
    jobs:
      - build

我的测试规范文件

describe('webdriver university - contact us page.', () => {
    beforeEach(async() => {
        await browser.maximizeWindow();
        await browser.url('https://webdriveruniversity.com/Contact-Us/contactus.html');
        await browser.pause(5000);
        const browserObj = (`>>Browser Object: ${JSON.stringify(browser)}`);
        console.log(browserObj);
        
    });
    it('valid submission - submit all information.', async () => {
        
        

        //first name
        const firstName = await $('//*[@name="first_name"]');

        //last name
        const lastName = await $('//*[@name="last_name"]');

        //email address
        const emailAddress = await $('//*[@name="email"]');

        // message
        const message= await $('//*[@name="message"]');
        //submit button
        const submitButton = await $('//input[@value="SUBMIT"]');

        //setValues for input field
        await firstName.setValue("John");
        await lastName.setValue("Abb");
        await emailAddress.setValue("[email protected]");
        await message.setValue("hello world");
        await submitButton.click();
        
       

        // submit button
        const onSuccessMessage = await $('#contact_reply h1');
        await expect(onSuccessMessage).toHaveText("Thank You for your Message!");
        
    });
    it('invalid submission - dont submit all information.', async () => {

        
       

        const firstName = await $('//*[@name="first_name"]');
        const lastName =  await $('//*[@name="last_name"]');
        const message = await $('//*[@name="message"]');
        const submitButton = await $('//input[@value="SUBMIT"]');

        await firstName.setValue("John");
        await lastName.setValue("Supper");
        await message.setValue("test message");
        await submitButton.click();
        await browser.pause(5000);

        //submit button to create error
        const onFailureMessage = await $('body');
        await expect(onFailureMessage).toHaveTextContaining(['Error: all fields are required','Error: Invalid email address']);
       // await expect(onFailureMessage).toHaveText('Error: all fields are required');
       // await expect(onFailureMessage).toHaveText('Error: Invalid email address');
        
        

    });
})

wdio.confg.js 文件:-

exports.config = {
    //
    // ====================
    // Runner Configuration
    // ====================
    // WebdriverIO supports running e2e tests as well as unit and component tests.
    runner: 'local',
    //
    // ==================
    // Specify Test Files
    // ==================
    // Define which test specs should run. The pattern is relative to the directory
    // of the configuration file being run.
    //
    // The specs are defined as an array of spec files (optionally using wildcards
    // that will be expanded). The test for each spec file will be run in a separate
    // worker process. In order to have a group of spec files run in the same worker
    // process simply enclose them in an array within the specs array.
    //
    // The path of the spec files will be resolved relative from the directory of
    // of the config file unless it's absolute.
    //
    specs: [
        './test/specs/**/*.js'
    ],
    // Patterns to exclude.
    exclude: [
        // 'path/to/excluded/files'
    ],
    //
    // ============
    // Capabilities
    // ============
    // Define your capabilities here. WebdriverIO can run multiple capabilities at the same
    // time. Depending on the number of capabilities, WebdriverIO launches several test
    // sessions. Within your capabilities you can overwrite the spec and exclude options in
    // order to group specific specs to a specific capability.
    //
    // First, you can define how many instances should be started at the same time. Let's
    // say you have 3 different capabilities (Chrome, Firefox, and Safari) and you have
    // set maxInstances to 1; wdio will spawn 3 processes. Therefore, if you have 10 spec
    // files and you set maxInstances to 10, all spec files will get tested at the same time
    // and 30 processes will get spawned. The property handles how many capabilities
    // from the same test should run tests.
    //
    maxInstances: 10,
    //
    // If you have trouble getting all important capabilities together, check out the
    // Sauce Labs platform configurator - a great tool to configure your capabilities:
    // https://saucelabs.com/platform/platform-configurator
    //
    capabilities: [{
        browserName: 'chrome'
    }],

    //
    // ===================
    // Test Configurations
    // ===================
    // Define all options that are relevant for the WebdriverIO instance here
    //
    // Level of logging verbosity: trace | debug | info | warn | error | silent
    logLevel: 'info',
    //
    // Set specific log levels per logger
    // loggers:
    // - webdriver, webdriverio
    // - @wdio/browserstack-service, @wdio/devtools-service, @wdio/sauce-service
    // - @wdio/mocha-framework, @wdio/jasmine-framework
    // - @wdio/local-runner
    // - @wdio/sumologic-reporter
    // - @wdio/cli, @wdio/config, @wdio/utils
    // Level of logging verbosity: trace | debug | info | warn | error | silent
    // logLevels: {
    //     webdriver: 'info',
    //     '@wdio/appium-service': 'info'
    // },
    //
    // If you only want to run your tests until a specific amount of tests have failed use
    // bail (default is 0 - don't bail, run all tests).
    bail: 0,
    //
    // Set a base URL in order to shorten url command calls. If your `url` parameter starts
    // with `/`, the base url gets prepended, not including the path portion of your baseUrl.
    // If your `url` parameter starts without a scheme or `/` (like `some/path`), the base url
    // gets prepended directly.
    baseUrl: 'https://webdriveruniversity.com/Contact-Us/contactus.html',
    //
    // Default timeout for all waitFor* commands.
    waitforTimeout: 10000,
    //
    // Default timeout in milliseconds for request
    // if browser driver or grid doesn't send response
    connectionRetryTimeout: 120000,
    //
    // Default request retries count
    connectionRetryCount: 3,
    //
    // Test runner services
    // Services take over a specific job you don't want to take care of. They enhance
    // your test setup with almost no effort. Unlike plugins, they don't add new
    // commands. Instead, they hook themselves up into the test process.
    // services: [],
    //
    // Framework you want to run your specs with.
    // The following are supported: Mocha, Jasmine, and Cucumber
    // see also: https://webdriver.io/docs/frameworks
    //
    // Make sure you have the wdio adapter package for the specific framework installed
    // before running any tests.
    framework: 'mocha',
    
    //
    // The number of times to retry the entire specfile when it fails as a whole
    // specFileRetries: 1,
    //
    // Delay in seconds between the spec file retry attempts
    // specFileRetriesDelay: 0,
    //
    // Whether or not retried spec files should be retried immediately or deferred to the end of the queue
    // specFileRetriesDeferred: false,
    //
    // Test reporter for stdout.
    // The only one supported by default is 'dot'
    // see also: https://webdriver.io/docs/dot-reporter
    reporters: ['spec'],

    // Options to be passed to Mocha.
    // See the full list at http://mochajs.org/
    mochaOpts: {
        ui: 'bdd',
        timeout: 60000
    },

    //
    // =====
    // Hooks
    // =====
    // WebdriverIO provides several hooks you can use to interfere with the test process in order to enhance
    // it and to build services around it. You can either apply a single function or an array of
    // methods to it. If one of them returns with a promise, WebdriverIO will wait until that promise got
    // resolved to continue.
    /**
     * Gets executed once before all workers get launched.
     * @param {object} config wdio configuration object
     * @param {Array.<Object>} capabilities list of capabilities details
     */
    // onPrepare: function (config, capabilities) {
    // },
    /**
     * Gets executed before a worker process is spawned and can be used to initialize specific service
     * for that worker as well as modify runtime environments in an async fashion.
     * @param  {string} cid      capability id (e.g 0-0)
     * @param  {object} caps     object containing capabilities for session that will be spawn in the worker
     * @param  {object} specs    specs to be run in the worker process
     * @param  {object} args     object that will be merged with the main configuration once worker is initialized
     * @param  {object} execArgv list of string arguments passed to the worker process
     */
    // onWorkerStart: function (cid, caps, specs, args, execArgv) {
    // },
    /**
     * Gets executed just after a worker process has exited.
     * @param  {string} cid      capability id (e.g 0-0)
     * @param  {number} exitCode 0 - success, 1 - fail
     * @param  {object} specs    specs to be run in the worker process
     * @param  {number} retries  number of retries used
     */
    // onWorkerEnd: function (cid, exitCode, specs, retries) {
    // },
    /**
     * Gets executed just before initialising the webdriver session and test framework. It allows you
     * to manipulate configurations depending on the capability or spec.
     * @param {object} config wdio configuration object
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {Array.<String>} specs List of spec file paths that are to be run
     * @param {string} cid worker id (e.g. 0-0)
     */
    // beforeSession: function (config, capabilities, specs, cid) {
    // },
    /**
     * Gets executed before test execution begins. At this point you can access to all global
     * variables like `browser`. It is the perfect place to define custom commands.
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {Array.<String>} specs        List of spec file paths that are to be run
     * @param {object}         browser      instance of created browser/device session
     */
    // before: function (capabilities, specs) {
    // },
    /**
     * Runs before a WebdriverIO command gets executed.
     * @param {string} commandName hook command name
     * @param {Array} args arguments that command would receive
     */
    // beforeCommand: function (commandName, args) {
    // },
    /**
     * Hook that gets executed before the suite starts
     * @param {object} suite suite details
     */
    // beforeSuite: function (suite) {
    // },
    /**
     * Function to be executed before a test (in Mocha/Jasmine) starts.
     */
    // beforeTest: function (test, context) {
    // },
    /**
     * Hook that gets executed _before_ a hook within the suite starts (e.g. runs before calling
     * beforeEach in Mocha)
     */
    // beforeHook: function (test, context, hookName) {
    // },
    /**
     * Hook that gets executed _after_ a hook within the suite starts (e.g. runs after calling
     * afterEach in Mocha)
     */
    // afterHook: function (test, context, { error, result, duration, passed, retries }, hookName) {
    // },
    /**
     * Function to be executed after a test (in Mocha/Jasmine only)
     * @param {object}  test             test object
     * @param {object}  context          scope object the test was executed with
     * @param {Error}   result.error     error object in case the test fails, otherwise `undefined`
     * @param {*}       result.result    return object of test function
     * @param {number}  result.duration  duration of test
     * @param {boolean} result.passed    true if test has passed, otherwise false
     * @param {object}  result.retries   information about spec related retries, e.g. `{ attempts: 0, limit: 0 }`
     */
    // afterTest: function(test, context, { error, result, duration, passed, retries }) {
    // },


    /**
     * Hook that gets executed after the suite has ended
     * @param {object} suite suite details
     */
    // afterSuite: function (suite) {
    // },
    /**
     * Runs after a WebdriverIO command gets executed
     * @param {string} commandName hook command name
     * @param {Array} args arguments that command would receive
     * @param {number} result 0 - command success, 1 - command error
     * @param {object} error error object if any
     */
    // afterCommand: function (commandName, args, result, error) {
    // },
    /**
     * Gets executed after all tests are done. You still have access to all global variables from
     * the test.
     * @param {number} result 0 - test pass, 1 - test fail
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {Array.<String>} specs List of spec file paths that ran
     */
    // after: function (result, capabilities, specs) {
    // },
    /**
     * Gets executed right after terminating the webdriver session.
     * @param {object} config wdio configuration object
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {Array.<String>} specs List of spec file paths that ran
     */
    // afterSession: function (config, capabilities, specs) {
    // },
    /**
     * Gets executed after all workers got shut down and the process is about to exit. An error
     * thrown in the onComplete hook will result in the test run failing.
     * @param {object} exitCode 0 - success, 1 - fail
     * @param {object} config wdio configuration object
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {<Object>} results object containing test results
     */
    // onComplete: function(exitCode, config, capabilities, results) {
    // },
    /**
    * Gets executed when a refresh happens.
    * @param {string} oldSessionId session ID of the old session
    * @param {string} newSessionId session ID of the new session
    */
    // onReload: function(oldSessionId, newSessionId) {
    // }
    /**
    * Hook that gets executed before a WebdriverIO assertion happens.
    * @param {object} params information about the assertion to be executed
    */
    // beforeAssertion: function(params) {
    // }
    /**
    * Hook that gets executed after a WebdriverIO assertion happened.
    * @param {object} params information about the assertion that was executed, including its results
    */
    // afterAssertion: function(params) {
    // }
}

来自 CircleCI 的错误消息

[0-2] 2024-03-17T00:54:02.058Z ERROR webdriver: RequestError: connect ECONNREFUSED 0.0.0.0:46181
[0-2]     at ClientRequest.<anonymous> (file:///home/circleci/repo/node_modules/got/dist/source/core/index.js:790:107)
[0-2]     at Object.onceWrapper (node:events:510:26)
[0-2]     at ClientRequest.emit (node:events:402:35)
[0-2]     at ClientRequest.emit (node:domain:475:12)
[0-2]     at Socket.socketErrorListener (node:_http_client:447:9)
[0-2]     at Socket.emit (node:events:390:28)
[0-2]     at Socket.emit (node:domain:475:12)
[0-2]     at emitErrorNT (node:internal/streams/destroy:164:8)
[0-2]     at emitErrorCloseNT (node:internal/streams/destroy:129:3)
[0-2]     at processTicksAndRejections (node:internal/process/task_queues:83:21)
[0-2]     at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1157:16)
[0-2] 2024-03-17T00:54:02.059Z ERROR @wdio/runner: Error: Failed to create session.
[0-2] Unable to connect to "http://0.0.0.0:46181/", make sure browser driver is running on that address.
[0-2] It seems like the service failed to start or is rejecting any connections.
[0-2]     at startWebDriverSession (file:///home/circleci/repo/node_modules/webdriver/build/utils.js:69:15)
[0-2]     at processTicksAndRejections (node:internal/process/task_queues:96:5)
[0-2]     at Function.newSession (file:///home/circleci/repo/node_modules/webdriver/build/index.js:20:45)
[0-2]     at remote (file:///home/circleci/repo/node_modules/webdriverio/build/index.js:45:22)
[0-2]     at Runner._startSession (file:///home/circleci/repo/node_modules/@wdio/runner/build/index.js:241:29)
[0-2]     at Runner._initSession (file:///home/circleci/repo/node_modules/@wdio/runner/build/index.js:207:25)
[0-2]     at Runner.run (file:///home/circleci/repo/node_modules/@wdio/runner/build/index.js:88:19)
[0-0] 2024-03-17T00:54:02.061Z ERROR webdriver: RequestError: connect ECONNREFUSED 0.0.0.0:35365
[0-0]     at ClientRequest.<anonymous> (file:///home/circleci/repo/node_modules/got/dist/source/core/index.js:790:107)
[0-0]     at Object.onceWrapper (node:events:510:26)
[0-0]     at ClientRequest.emit (node:events:402:35)
[0-0]     at ClientRequest.emit (node:domain:475:12)
[0-0]     at Socket.socketErrorListener (node:_http_client:447:9)
[0-0]     at Socket.emit (node:events:390:28)
[0-0]     at Socket.emit (node:domain:475:12)
[0-0]     at emitErrorNT (node:internal/streams/destroy:164:8)
[0-0]     at emitErrorCloseNT (node:internal/streams/destroy:129:3)
[0-0]     at processTicksAndRejections (node:internal/process/task_queues:83:21)
[0-0]     at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1157:16)
[0-0] 2024-03-17T00:54:02.062Z ERROR @wdio/runner: Error: Failed to create session.
[0-0] Unable to connect to "http://0.0.0.0:35365/", make sure browser driver is running on that address.
[0-0] It seems like the service failed to start or is rejecting any connections.
[0-0]     at startWebDriverSession (file:///home/circleci/repo/node_modules/webdriver/build/utils.js:69:15)
[0-0]     at processTicksAndRejections (node:internal/process/task_queues:96:5)
[0-0]     at Function.newSession (file:///home/circleci/repo/node_modules/webdriver/build/index.js:20:45)
[0-0]     at remote (file:///home/circleci/repo/node_modules/webdriverio/build/index.js:45:22)
[0-0]     at Runner._startSession (file:///home/circleci/repo/node_modules/@wdio/runner/build/index.js:241:29)
[0-0]     at Runner._initSession (file:///home/circleci/repo/node_modules/@wdio/runner/build/index.js:207:25)
[0-0]     at Runner.run (file:///home/circleci/repo/node_modules/@wdio/runner/build/index.js:88:19)
[0-1] 2024-03-17T00:54:02.072Z ERROR webdriver: RequestError: connect ECONNREFUSED 0.0.0.0:41333
[0-1]     at ClientRequest.<anonymous> (file:///home/circleci/repo/node_modules/got/dist/source/core/index.js:790:107)
[0-1]     at Object.onceWrapper (node:events:510:26)
[0-1]     at ClientRequest.emit (node:events:402:35)
[0-1]     at ClientRequest.emit (node:domain:475:12)
[0-1]     at Socket.socketErrorListener (node:_http_client:447:9)
[0-1]     at Socket.emit (node:events:390:28)
[0-1]     at Socket.emit (node:domain:475:12)
[0-1]     at emitErrorNT (node:internal/streams/destroy:164:8)
[0-1]     at emitErrorCloseNT (node:internal/streams/destroy:129:3)
[0-1]     at processTicksAndRejections (node:internal/process/task_queues:83:21)
[0-1]     at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1157:16)
[0-1] 2024-03-17T00:54:02.072Z ERROR @wdio/runner: Error: Failed to create session.
[0-1] Unable to connect to "http://0.0.0.0:41333/", make sure browser driver is running on that address.
[0-1] It seems like the service failed to start or is rejecting any connections.
[0-1]     at startWebDriverSession (file:///home/circleci/repo/node_modules/webdriver/build/utils.js:69:15)
[0-1]     at processTicksAndRejections (node:internal/process/task_queues:96:5)
[0-1]     at Function.newSession (file:///home/circleci/repo/node_modules/webdriver/build/index.js:20:45)
[0-1]     at remote (file:///home/circleci/repo/node_modules/webdriverio/build/index.js:45:22)
[0-1]     at Runner._startSession (file:///home/circleci/repo/node_modules/@wdio/runner/build/index.js:241:29)
[0-1]     at Runner._initSession (file:///home/circleci/repo/node_modules/@wdio/runner/build/index.js:207:25)
[0-1]     at Runner.run (file:///home/circleci/repo/node_modules/@wdio/runner/build/index.js:88:19)
[0-2] FAILED in chrome - file:///test/specs/test.e2e.js
2024-03-17T00:54:02.172Z INFO @wdio/cli:launcher: Run onWorkerEnd hook
[0-0] FAILED in chrome - file:///test/specs/contact-us.spec.js
2024-03-17T00:54:02.178Z INFO @wdio/cli:launcher: Run onWorkerEnd hook
[0-1] FAILED in chrome - file:///test/specs/mocha-example.js
2024-03-17T00:54:02.186Z INFO @wdio/cli:launcher: Run onWorkerEnd hook
2024-03-17T00:54:02.186Z INFO @wdio/cli:launcher: Run onComplete hook

Spec Files:      0 passed, 3 failed, 3 total (100% completed) in 00:00:15  

2024-03-17T00:54:02.187Z INFO @wdio/local-runner: Shutting down spawned worker
2024-03-17T00:54:02.438Z INFO @wdio/local-runner: Waiting for 0 to shut down gracefully
2024-03-17T00:54:02.439Z INFO @wdio/local-runner: shutting down

Exited with code exit status 1
continuous-integration circleci webdriver-io browser-automation circleci-workflows
1个回答
0
投票

我也是新手,但我认为如果不设置设备连接位置,就无法在管道上运行

是的,在管道上,您需要设置一些本地主机将其更改为服务器

© www.soinside.com 2019 - 2024. All rights reserved.