Jsdom: Kesalahan: Tidak diterapkan: HTMLFormElement.prototype.submit

Dibuat pada 10 Agu 2017  ·  21Komentar  ·  Sumber: jsdom/jsdom

Kesalahan

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()

})

Komentar yang paling membantu

Mengalami ini saat menulis tes menggunakan Jest.
Solusi saya:

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

Menambahkan ini sebelum saya memasang komponen saya di test case.
Setidaknya itu membuat konsol saya tetap bersih.

Semua 21 komentar

Ya memang penyerahan formulir tidak dilaksanakan. Ini bekerja seperti yang diharapkan.

@runbb apakah Anda menemukan solusi lain untuk ini? Saya mencoba melakukan hal yang sama.

@domenic apakah Anda punya ide tentang cara mencapai fungsi ini? Mungkin perpustakaan lain?

@stefanbuck tidak :(

@domenic apakah ada alasan mengapa ini tidak diterapkan? Apakah Anda terbuka untuk permintaan tarik untuk mengimplementasikan ini?

Lihat https://github.com/jsdom/jsdom#unimplemented -parts-of-the-web-platform. Ini tentang navigasi, dan dengan demikian merupakan usaha besar. Anda boleh mencoba, tetapi harap dipahami bahwa pada dasarnya Anda harus menerapkan semua https://html.spec.whatwg.org/multipage/browsing-the-web.html.

@domenic akan lebih baik untuk menonaktifkan pesan kesalahan ini.

Anda dapat melakukannya; lihat readme di jsdomErrors.

Apakah masih mungkin untuk menerapkan penanganan input saat formulir dikirimkan?
event.target[name] tidak ditentukan.

Solusi saya untuk saat ini adalah form.dispatchEvent(new Event('submit'));

Mengalami ini saat menulis tes menggunakan Jest.
Solusi saya:

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

Menambahkan ini sebelum saya memasang komponen saya di test case.
Setidaknya itu membuat konsol saya tetap bersih.

Saya berhasil membungkam kesalahan dengan melakukan:

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

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

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

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

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

Mengalami ini saat menulis tes menggunakan Jest.
Solusi saya:

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

Menambahkan ini sebelum saya memasang komponen saya di test case.
Setidaknya itu membuat konsol saya tetap bersih.

Hai! Saya suka solusi Anda, tetapi saya tidak yakin harus melakukannya di mana, mungkin Anda bisa membantu? Saya memiliki kode berikut: (lihat saya menambahkan "perbaikan" Anda sebagai pernyataan pertama di main())

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();

}

tetapi masih menaikkan Error: Not implemented: HTMLFormElement.prototype.submit

Solusi yang mungkin:

// 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;
})

Jika Anda tidak peduli dengan submit Anda juga dapat menonaktifkan pengiriman formulir dengan

<form onsubmit="return false;">

Tidak ada lagi pesan kesalahan

Solusi yang mungkin:

// 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;
})

Solusi ini memecahkan stacktrace dari kesalahan nyata dan akan lebih sulit untuk menemukannya.

Sebelum
image

Setelah
image

Jika Anda menggunakan konsol virtual dan mendengarkan "jsdomError" s Anda harus mendapatkan objek pengecualian dengan jejak tumpukan.

@domenic , dapatkah Anda menunjukkan kepada kami cara menggunakan konsol virtual dari file pengujian itu sendiri?

Mari kita sarankan file tes berikutnya

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()
})

PS: ada candaan sebagai test runner

Maaf, Anda perlu meminta dukungan Jest tentang cara menggunakan Jest. jsdom hanya dapat memberikan dukungan untuk jsdom itu sendiri, bukan untuk paket apa pun yang menggunakan jsdom sebagai dependensi.

Saya memiliki komponen yang menggunakan formulir tetapi tidak menggunakan kirim pada formulir dan masih melihat kesalahan ini. Saya menyelesaikannya dengan menambahkan type="button" ke tombol saya yang lain di dalam formulir.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

eszthoff picture eszthoff  ·  3Komentar

mitar picture mitar  ·  4Komentar

josephrexme picture josephrexme  ·  4Komentar

khalyomede picture khalyomede  ·  3Komentar

tolmasky picture tolmasky  ·  4Komentar