Jsdom: рддреНрд░реБрдЯрд┐: рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛: HTMLFormElement.prototype.submit

рдХреЛ рдирд┐рд░реНрдорд┐рдд 10 рдЕрдЧре░ 2017  ┬╖  21рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: jsdom/jsdom

рддреНрд░реБрдЯрд┐

HTMLInputElement {} HTMLInputElement {}
Error: Not implemented: HTMLFormElement.prototype.submit
    at module.exports (/home/xlmnxp/Documents/Nodejs/DownFrom99/node_modules/jsdom/lib/jsdom/browser/not-implemented.js:9:17)
    at HTMLFormElementImpl.submit (/home/xlmnxp/Documents/Nodejs/DownFrom99/node_modules/jsdom/lib/jsdom/living/nodes/HTMLFormElement-impl.js:68:5)
    at HTMLFormElement.submit (/home/xlmnxp/Documents/Nodejs/DownFrom99/node_modules/jsdom/lib/jsdom/living/generated/HTMLFormElement.js:18:21)
    at /home/xlmnxp/Documents/Nodejs/DownFrom99/app.js:12:10
    at process._tickCallback (internal/process/next_tick.js:109:7) undefined
import { JSDOM } from "jsdom";

JSDOM.fromURL("http://localhost/").then((dom:JSDOM) => {
    let document = dom.window.document;
    let window = dom.window;

    let form = <HTMLFormElement> document.querySelector("form");
    let urlField = <HTMLInputElement> document.querySelector("input[name='formvalue']");
    let submitButton = <HTMLInputElement> document.querySelector("input[type='submit']");

    console.log(submitButton,urlField)

    urlField.value = "https://www.youtube.com/watch?v=RWjDLfx8Lww";

    form.submit()

})

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЬреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╕рдордп рдЗрд╕рдореЗрдВ рднрд╛рдЧ рд▓реЗрдВред
рдореЗрд░рд╛ рдЙрдкрд╛рдп:

window.HTMLFormElement.prototype.submit = () => {}

рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЛ рдорд╛рдЙрдВрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред
рдХрдо рд╕реЗ рдХрдо рдпрд╣ рдореЗрд░реЗ рдХрдВрд╕реЛрд▓ рдХреЛ рд╕рд╛рдл рд░рдЦрддрд╛ рд╣реИред

рд╕рднреА 21 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╣рд╛рдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдлреЙрд░реНрдо рдЬрдорд╛ рдХрд░рдирд╛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

@runbb рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛? рдореИрдВ рд╡рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

@domenic рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ? рд╢рд╛рдпрдж рдПрдХ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп?

@stefanbuck рдирд╣реАрдВ :(

@domenic рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ?

рджреЗрдЦреЗрдВ https://github.com/jsdom/jsdom#unimplemented -parts-of-the-web-platformред рдпрд╣ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдЙрдкрдХреНрд░рдо рд╣реИред рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ, рд▓реЗрдХрд┐рди рдХреГрдкрдпрд╛ рд╕рдордЭреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рднреА https://html.spec.whatwg.org/multipage/browsing-the-web.html рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА

@domenic рдЗрд╕ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдЖрдк рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; jsdomErrors рдкрд░ рд░реАрдбрдореА рджреЗрдЦреЗрдВред

рдХреНрдпрд╛ рдлреЙрд░реНрдо рдЬрдорд╛ рд╣реЛрдиреЗ рдкрд░ рдЗрдирдкреБрдЯ рдХреА рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЕрднреА рднреА рд╕рдВрднрд╡ рд╣реИ?
event.target[name] рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИрдВред

рдЕрднреА рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди form.dispatchEvent(new Event('submit'));

рдЬреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╕рдордп рдЗрд╕рдореЗрдВ рднрд╛рдЧ рд▓реЗрдВред
рдореЗрд░рд╛ рдЙрдкрд╛рдп:

window.HTMLFormElement.prototype.submit = () => {}

рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЛ рдорд╛рдЙрдВрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред
рдХрдо рд╕реЗ рдХрдо рдпрд╣ рдореЗрд░реЗ рдХрдВрд╕реЛрд▓ рдХреЛ рд╕рд╛рдл рд░рдЦрддрд╛ рд╣реИред

рдореИрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╢рд╛рдВрдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛:

describe('submit', () => {
  let emit;

  beforeAll(() => {
    ({ emit } = window._virtualConsole);
  });

  beforeEach(() => {
    window._virtualConsole.emit = jest.fn();
  });

  afterAll(() => {
    window._virtualConsole.emit = emit;
  });

  it('should handle submit ', () => {
    ...
  });
});

рдпрд╣рд╛рдБ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ https://kula.blog/posts/test_on_submit_in_react_testing_library/

рдЬреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╕рдордп рдЗрд╕рдореЗрдВ рднрд╛рдЧ рд▓реЗрдВред
рдореЗрд░рд╛ рдЙрдкрд╛рдп:

window.HTMLFormElement.prototype.submit = () => {}

рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЛ рдорд╛рдЙрдВрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред
рдХрдо рд╕реЗ рдХрдо рдпрд╣ рдореЗрд░реЗ рдХрдВрд╕реЛрд▓ рдХреЛ рд╕рд╛рдл рд░рдЦрддрд╛ рд╣реИред

рдирдорд╕реНрддреЗ! рдореБрдЭреЗ рдЖрдкрдХрд╛ рдХрд╛рдордХрд╛рдЬ рдкрд╕рдВрдж рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╣рд╛рдВ рдХрд░рдирд╛ рд╣реИ, рдХреНрдпрд╛ рдЖрдк рд╢рд╛рдпрдж рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдореЗрд░реЗ рдкрд╛рд╕ рдирд┐рдореНрди рдХреЛрдб рд╣реИ: (рджреЗрдЦреЗрдВ рдореИрдВрдиреЗ рдЖрдкрдХреЗ "рдлрд┐рдХреНрд╕" рдХреЛ рдореБрдЦреНрдп () рдореЗрдВ рдкрд╣рд▓реЗ рдХрдерди рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рд╣реИ)

const jsdom = require("jsdom");
const { JSDOM } = jsdom;

JSDOM.fromFile("index.html", null).then(dom => {
    main(dom.window);
});

function main(window){

  window.HTMLFormElement.prototype.submit = () => {}

  var oldAlert = window.alert;
  window.alert = function() {
    console.log("Alert fired with arguments: " + arguments);
    oldAlert.apply(window, arguments);
  };

  window.document.getElementsByTagName("button")[0].click();

}

рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рд╡рд╣реА Error: Not implemented: HTMLFormElement.prototype.submit рдмрдврд╝рд╛ рд░рд╣рд╛ рд╣реИ

рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрдерд┐рддрд┐:

// Following code mocks window.console.error
// to ignore the "Not implemented: HTMLFormElement.prototype.submit".
//
// Problem: We use "form.onsubmit" event listener in some tests,
// but HTMLFormElement.prototype.submit is not implemented in JSDOM,
// although the tests are passing and handler fires.
//
// More:
// https://github.com/jsdom/jsdom/issues/1937
// https://github.com/facebook/jest/issues/5223#issuecomment-489422244

let origErrorConsole;

beforeEach(() => {
  origErrorConsole = window.console.error;

  window.console.error = (...args) => {
    const firstArg = args.length > 0 && args[0];

    const shouldBeIgnored =
      firstArg &&
      typeof firstArg === 'string' &&
      firstArg.includes('Not implemented: HTMLFormElement.prototype.submit');

    if (!shouldBeIgnored) {
      origErrorConsole(...args);
    }
  }
})

afterEach(() => {
  window.console.error = origErrorConsole;
})

рдпрджрд┐ рдЖрдк submit рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдлрд╝реЙрд░реНрдо рдХреЛ рд╕рдмрдорд┐рдЯ рдХрд░рдирд╛ рдЕрдХреНрд╖рдо рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

<form onsubmit="return false;">

рдХреЛрдИ рдФрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдирд╣реАрдВ

рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрдерд┐рддрд┐:

// Following code mocks window.console.error
// to ignore the "Not implemented: HTMLFormElement.prototype.submit".
//
// Problem: We use "form.onsubmit" event listener in some tests,
// but HTMLFormElement.prototype.submit is not implemented in JSDOM,
// although the tests are passing and handler fires.
//
// More:
// https://github.com/jsdom/jsdom/issues/1937
// https://github.com/facebook/jest/issues/5223#issuecomment-489422244

let origErrorConsole;

beforeEach(() => {
  origErrorConsole = window.console.error;

  window.console.error = (...args) => {
    const firstArg = args.length > 0 && args[0];

    const shouldBeIgnored =
      firstArg &&
      typeof firstArg === 'string' &&
      firstArg.includes('Not implemented: HTMLFormElement.prototype.submit');

    if (!shouldBeIgnored) {
      origErrorConsole(...args);
    }
  }
})

afterEach(() => {
  window.console.error = origErrorConsole;
})

рдпрд╣ рд╕рдорд╛рдзрд╛рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕реНрдЯреИрдХрдЯреНрд░реЗрд╕ рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдвреВрдВрдврдирд╛ рдХрдард┐рди рд╣реЛрдЧрд╛ред

рдкрд╣рд▓реЗ
image

рдмрд╛рдж рдореЗрдВ
image

рдпрджрд┐ рдЖрдк рд╡рд░реНрдЪреБрдЕрд▓ рдХрдВрд╕реЛрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ "jsdomError" s рд╕реБрдирддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рдЕрдкрд╡рд╛рдж рдСрдмреНрдЬреЗрдХреНрдЯ рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред

@domenic , рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рд╣рдореЗрдВ рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╡рд░реНрдЪреБрдЕрд▓ рдХрдВрд╕реЛрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ?

рдЖрдЗрдП рд╕реБрдЭрд╛рд╡ рджреЗрдВ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдЕрдЧрд▓реА рд╣реИ

import React from 'react'

import {render} from '@testing-library/react'

import ComponentWithSubmit from './ComponentWithSubmit'

test('Component with form', () => {
  const {getByText} = render(<ComponentWithSubmit />)
  expect(getByText('I am inside form')).toBeInTheDocument()
})

рдкреБрдирд╢реНрдЪ: рдПрдХ рдкрд░реАрдХреНрд╖рдг рдзрд╛рд╡рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдордЬрд╝рд╛рдХ рд╣реИ

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдЖрдкрдХреЛ рдЬреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЬреЗрд╕реНрдЯ рд╕реЗ рдкреВрдЫрдирд╛ рд╣реЛрдЧрд╛ред Jsdom рдХреЗрд╡рд▓ jsdom рдХреЗ рд▓рд┐рдП рд╣реА рд╕рдорд░реНрдерди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рдХрд┐рд╕реА рднреА рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдЬреЛ jsdom рдХреЛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдлреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдХ рдШрдЯрдХ рдерд╛ рд▓реЗрдХрд┐рди рдлреЙрд░реНрдо рдкрд░ рд╕рдмрдорд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдЕрднреА рднреА рдпрд╣ рддреНрд░реБрдЯрд┐ рджреЗрдЦ рд░рд╣рд╛ рдерд╛ред рдореИрдВрдиреЗ рдлреЙрд░реНрдо рдХреЗ рднреАрддрд░ рдЕрдкрдиреЗ рдЕрдиреНрдп рдмрдЯрдиреЛрдВ рдореЗрдВ рдЯрд╛рдЗрдк = "рдмрдЯрди" рдЬреЛрдбрд╝рдХрд░ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

machineghost picture machineghost  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

JacksonGariety picture JacksonGariety  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kentmw picture kentmw  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jacekpl picture jacekpl  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

amfio picture amfio  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ