codeceptjs / CodeceptJS

Supercharged End 2 End Testing Framework for NodeJS

Home Page:http://codecept.io

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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

myrepojuly1987 opened this issue · comments

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'
}

@kobenguyent @DavertMik could you pls help with this issue?

Hello @kobenguyent .. Would you be able to help with this issue?