Skip to content

Codeceptjs version > 3.5.8 - Throws DataCloneError when I.executeScript command is used with run-workers (multiple browser parallel execution) #4165

Closed
@myrepojuly

Description

@myrepojuly

What are you trying to achieve?

In my application, there are several ReactJS fields for which we utilize the executeScript command to assign values. While this process functions correctly in a non-parallel execution environment, it encounters issues when executed in parallel.

**Note: this works fine with codeceptjs versions lesser than 3.5.8 (Example, with 3.5.6 this error does not occur).
Command to run the test
npx codeceptjs run-workers 2 profile1 --verbose
**

What do you get instead?

Provide console output if related. Use --verbose mode for more details.

Error processing test.after event:
DataCloneError: function (name, func, attachToElement = false, proto, instances) {
            const customCommand = typeof com...<omitted>... } could not be cloned.
    at new DOMException (node:internal/per_context/domexception:53:5)
    at sendToParentThread (E:\Codeceptjs_pipeline\parenttrigger\node_modules\codeceptjs\lib\command\workers\runTests.js:282:14)
    at EventEmitter.<anonymous> (E:\Codeceptjs_pipeline\parenttrigger\node_modules\codeceptjs\lib\command\workers\runTests.js:227:49)
    at EventEmitter.emit (node:events:530:35)
    at EventEmitter.emit (node:domain:488:12)
    at Object.emit (E:\Codeceptjs_pipeline\parenttrigger\node_modules\codeceptjs\lib\event.js:149:28)
    at E:\Codeceptjs_pipeline\parenttrigger\node_modules\codeceptjs\lib\scenario.js:182:11
    at injectHook (E:\Codeceptjs_pipeline\parenttrigger\node_modules\codeceptjs\lib\scenario.js:10:5)
    at module.exports.teardown (E:\Codeceptjs_pipeline\parenttrigger\node_modules\codeceptjs\lib\scenario.js:180:10)
    at Context.<anonymous> (E:\Codeceptjs_pipeline\parenttrigger\node_modules\codeceptjs\lib\ui.js:114:66)

Provide test source code if related

Feature('CodeceptJS test');

const{I} = inject();

Scenario('test something', async () => {
  await I.amOnPage('/react/demos/?_gl=1*1lz342q*_ga*MTY3MTc2MDgxLjE3MDY2ODgzOTg.*_ga_41J4HFMX1J*MTcwNjY4ODM5Ny4xLjAuMTcwNjY4ODM5Ny4wLjAuMA..#/bootstrap5/textboxes/default');
  await I.wait(10); // temp adding a wait
  // for versions < 3.5.8 use helper to locate the element
  const element = await I.grabWebElements({id: 'textbox_2'})
  // set the value in react text field
  await I.executeScript((element, value) => {
    const valueSetter = Object.getOwnPropertyDescriptor(element, 'value').set;
    const prototype = Object.getPrototypeOf(element);
    const prototypeValueSetter = Object.getOwnPropertyDescriptor(prototype, 'value').set;
    if (valueSetter && valueSetter !== prototypeValueSetter) {
        prototypeValueSetter.call(element, value);
    } else {
        valueSetter.call(element, value);
    }
    element.dispatchEvent(new Event('input', { bubbles: true }));
  }, element[0], 'test');
})


Details

  • CodeceptJS version: v3.5.12
  • NodeJS Version: 20.11.0
  • Operating System: Windows 11 10.0.22631 and MacOS
  • puppeteer || webdriverio || testcafe version (if related) : "webdriverio": "^8.29.1"
  • Configuration file:
const { setHeadlessWhen, setCommonPlugins } = require('@codeceptjs/configure');
// turn on headless mode when running with HEADLESS=true environment variable
// export HEADLESS=true && npx codeceptjs run
setHeadlessWhen(process.env.HEADLESS);

// enable all common plugins https://github.com/codeceptjs/configure#setcommonplugins 
setCommonPlugins();

/** @type {CodeceptJS.MainConfig} */
exports.config = {
   tests: './test.js',
  output: './output',
  helpers: {
    WebDriver: {
      host: 'localhost',
      port: 4444,
      url: 'https://ej2.syncfusion.com/',
      browser: 'MicrosoftEdge',
      windowSize: 'maximize',
      restart: true, 
    }
  },
  multiple: {
    profile1: {
      browsers: [
        {
          browser: "MicrosoftEdge",
        },
        {
          browser: "chrome",
        }
      ]
    }
  },
  include: {
    I: './steps_file.js'
  },
  fullPromiseBased: true,
  name: 'parenttrigger'
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions