Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[With test] Embedded JavaScript is not executed #1692

Open
Spixmaster opened this issue Jan 16, 2025 · 6 comments
Open

[With test] Embedded JavaScript is not executed #1692

Spixmaster opened this issue Jan 16, 2025 · 6 comments
Labels
bug Something isn't working

Comments

@Spixmaster
Copy link

Spixmaster commented Jan 16, 2025

v16.6.0 with Bun.

The following test does not produce the website like in the browser due to no execution of the JavaScript.

import {test} from "bun:test";
import {Browser, BrowserContext, BrowserPage} from "happy-dom";

test("showcase", async (): Promise<undefined> =>
{
    const browser: Browser = new Browser({
        settings: {
            disableErrorCapturing: true,
            disableJavaScriptEvaluation: false
        }
    });
    const context: BrowserContext = browser.defaultContext;
    const page: BrowserPage = context.newPage();
    await page.goto("https://www.arbeitsagentur.de/jobsuche/suche?berufsfeld=Landwirtschaft&angebotsart=1");
    //@ts-expect-error
    global.window = page.mainFrame.window;
    //@ts-expect-error
    global.document = page.mainFrame.window.document;
    localStorage.clear();

    await page.waitUntilComplete();

    //TODO
    console.log(page.content);
});

Is it even possible to use happy-dom with these websites or do I need to use puppeteer?

I can even reproduce with a much simpler example. JavaScript is not executed automatically.

import {assert} from "assert-ts";
import {expect, test} from "bun:test";
import {Browser, BrowserContext, BrowserErrorCaptureEnum, BrowserPage, Window} from "happy-dom";

test("tmp", async (): Promise<undefined> =>
{
    const browser: Browser = new Browser({
        settings: {
            disableErrorCapturing: true,
            disableJavaScriptEvaluation: false
        }
    });
    const context: BrowserContext = browser.defaultContext;
    const page: BrowserPage = context.newPage();
    //@ts-expect-error
    const document: Document = page.mainFrame.document;

    const html_content = `
<!DOCTYPE html>
<html>
<head>
  <title>Happy DOM Example</title>
  <script id="a">
      console.log("hi from page");
      const messageElement = document.getElementById('message');
      if (messageElement) {
        messageElement.textContent = 'Hello from Happy DOM!';
      }
  </script>
</head>
<body>
  <div id="message">Original Content</div>
</body>
</html>
`;

    document.write(html_content);

    await page.waitUntilComplete();

    //Uncommented for a workaround.
    //const script = document.getElementById("a");
    //assert(script !== null);
    //console.log(script.textContent);
    //page.evaluate(script.textContent);

    //Verify the result.
    const messageElement = document.getElementById("message");
    console.log(messageElement?.textContent); // Outputs: "Hello from Happy DOM!"
});
@Spixmaster Spixmaster added the bug Something isn't working label Jan 16, 2025
@capricorn86
Copy link
Owner

capricorn86 commented Jan 17, 2025

Thank you for reporting @Spixmaster! 🙂

I'm not exactly sure why it is not loaded at all. I need to investigate further. But at least one of the reasons is because Happy DOM doesn't have support for ESM scripts (import, export etc.) yet.

However, I also need support for ESM for one project and a lot of other people in the community do to, so I will definitely prioritize adding support for it.

Task:
#320

@Spixmaster
Copy link
Author

Spixmaster commented Jan 18, 2025

@capricorn86 I further investigated the issue. It related to this one, oven-sh/bun#16363. It seems to be an error by Bun.

@capricorn86
Copy link
Owner

@Spixmaster Happy DOM now supports ECMAScript Modules. This should help with loading the page 🙂

@Spixmaster
Copy link
Author

The error still persist but as mentioned before is probably caused by oven-sh/bun#16363.

@Spixmaster
Copy link
Author

Spixmaster commented Feb 6, 2025

I tried the following with Nodejs since Bun has the mentioned error. The embedded JavaScript is still not executed.

Source code:

import {GlobalRegistrator} from "@happy-dom/global-registrator";
import {Browser, type BrowserContext, type BrowserPage} from "happy-dom";

(async (): Promise<undefined> =>
{
    {
        GlobalRegistrator.register();
        const browser: Browser = new Browser({
            settings: {
                disableErrorCapturing: true,
                disableJavaScriptEvaluation: false
            }
        });
        const context: BrowserContext = browser.defaultContext;
        const page: BrowserPage = context.newPage();
        await page.goto("https://www.arbeitsagentur.de/jobsuche/suche?berufsfeld=Landwirtschaft&angebotsart=1");
        //@ts-expect-error
        global.window = page.mainFrame.window;
        //@ts-expect-error
        global.document = page.mainFrame.window.document;
        localStorage.clear();

        await page.waitUntilComplete();

        //TODO
        console.log(page.content);
    }

    {
        const browser: Browser = new Browser({
            settings: {
                disableErrorCapturing: true,
                disableJavaScriptEvaluation: false
            }
        });
        const context: BrowserContext = browser.defaultContext;
        const page: BrowserPage = context.newPage();
        //@ts-expect-error
        const document: Document = page.mainFrame.document;

        const html_content = `
<!DOCTYPE html>
<html>
<head>
  <title>Happy DOM Example</title>
  <script id="a">
      console.log("hi from page");
      const messageElement = document.getElementById('message');
      if (messageElement) {
        messageElement.textContent = 'Hello from Happy DOM!';
      }
  </script>
</head>
<body>
  <div id="message">Original Content</div>
</body>
</html>
`;

        document.write(html_content);

        await page.waitUntilComplete();

        //Uncommented for a workaround.
        //const script = document.getElementById("a");
        //assert(script !== null);
        //console.log(script.textContent);
        //page.evaluate(script.textContent);

        //Verify the result.
        const messageElement = document.getElementById("message");
        console.log(messageElement?.textContent); // Outputs: "Hello from Happy DOM!"
    }
})();
<html lang="de" data-beasties-container="" class="hydrated"><head>
  <title>Jobsuche der BA</title>

  <meta name="google-site-verification" content="p13Ggb4Cq78RdCjrz7uf5wUo_74UB3TigT6o9yk5xz8">

  <base href="/jobsuche/">

  <meta charset="utf-8"><style data-styles="">bahf-fallback-footer,bahf-fallback-header{visibility:hidden}.hydrated{visibility:inherit}</style>
  <meta http-equiv="content-language" content="DE">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="description" content="Jobsuche der Bundesagentur für Arbeit. Hier Stellensuche nach neusten Jobs oder Ausbildungsplätzen starten in einer der größten Jobbörsen Deutschlands.">
  <meta name="referrer" content="no-referrer">

  <link rel="apple-touch-icon" sizes="180x180" href="assets/apple-touch-icon.png">
  <link rel="icon" type="image/png" href="assets/favicon-32x32.png" sizes="32x32">
  <link rel="icon" type="image/png" href="assets/favicon-16x16.png" sizes="16x16">
  <link rel="icon" type="image/x-icon" href="assets/favicon.ico">

  <link rel="preconnect" href="https://web.arbeitsagentur.de">
  <link rel="preconnect" href="https://arbeitsagentur.de">

  <script src="config/config.js"></script>
<style>:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13, 110, 253;--bs-secondary-rgb:108, 117, 125;--bs-success-rgb:25, 135, 84;--bs-info-rgb:13, 202, 240;--bs-warning-rgb:255, 193, 7;--bs-danger-rgb:220, 53, 69;--bs-light-rgb:248, 249, 250;--bs-dark-rgb:33, 37, 41;--bs-primary-text-emphasis:rgb(5.2, 44, 101.2);--bs-secondary-text-emphasis:rgb(43.2, 46.8, 50);--bs-success-text-emphasis:rgb(10, 54, 33.6);--bs-info-text-emphasis:rgb(5.2, 80.8, 96);--bs-warning-text-emphasis:rgb(102, 77.2, 2.8);--bs-danger-text-emphasis:rgb(88, 21.2, 27.6);--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:rgb(206.6, 226, 254.6);--bs-secondary-bg-subtle:rgb(225.6, 227.4, 229);--bs-success-bg-subtle:rgb(209, 231, 220.8);--bs-info-bg-subtle:rgb(206.6, 244.4, 252);--bs-warning-bg-subtle:rgb(255, 242.6, 205.4);--bs-danger-bg-subtle:rgb(248, 214.6, 217.8);--bs-light-bg-subtle:rgb(251.5, 252, 252.5);--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:rgb(158.2, 197, 254.2);--bs-secondary-border-subtle:rgb(196.2, 199.8, 203);--bs-success-border-subtle:rgb(163, 207, 186.6);--bs-info-border-subtle:rgb(158.2, 233.8, 249);--bs-warning-border-subtle:rgb(255, 230.2, 155.8);--bs-danger-border-subtle:rgb(241, 174.2, 180.6);--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255, 255, 255;--bs-black-rgb:0, 0, 0;--bs-font-sans-serif:Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace:SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, .15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#020E25;--bs-body-color-rgb:2, 14, 37;--bs-body-bg:#F9FBFC;--bs-body-bg-rgb:249, 251, 252;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0, 0, 0;--bs-secondary-color:rgba(33, 37, 41, .75);--bs-secondary-color-rgb:33, 37, 41;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233, 236, 239;--bs-tertiary-color:rgba(33, 37, 41, .5);--bs-tertiary-color-rgb:33, 37, 41;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248, 249, 250;--bs-heading-color:inherit;--bs-link-color:#0d6efd;--bs-link-color-rgb:13, 110, 253;--bs-link-decoration:none;--bs-link-hover-color:rgb(10.4, 88, 202.4);--bs-link-hover-color-rgb:10, 88, 202;--bs-code-color:#D42C80;--bs-highlight-color:#212529;--bs-highlight-bg:rgb(255, 242.6, 205.4);--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, .175);--bs-border-radius:5px;--bs-border-radius-sm:.25rem;--bs-border-radius-lg:.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 5px 7px 0 rgba(0,0,0,.2), 0 4px 24px 0 rgba(0,0,0,.08);--bs-box-shadow-sm:0 2px 4px 0 rgba(0,0,0,.16), 0 4px 24px 0 rgba(0,0,0,.08);--bs-box-shadow-lg:0 12px 10px -2px rgba(0,0,0,.08), 0 12px 24px 4px rgba(0,0,0,.08);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, .075);--bs-focus-ring-width:.25rem;--bs-focus-ring-opacity:.25;--bs-focus-ring-color:rgba(13, 110, 253, .25);--bs-form-valid-color:#198754;--bs-form-valid-border-color:#198754;--bs-form-invalid-color:#dc3545;--bs-form-invalid-border-color:#dc3545}*,*:before,*:after{box-sizing:border-box}@media (prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1280px;--bs-breakpoint-xxl:1400px}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:400;src:url(https://web.arbeitsagentur.de/design/dpl/assets/3.7.0/fonts/roboto-v20-latin-ext-regular.eot);src:local("Roboto"),local("Roboto-Regular"),url(https://web.arbeitsagentur.de/design/dpl/assets/3.7.0/fonts/roboto-v20-latin-ext-regular.eot?#iefix) format("embedded-opentype"),url(https://web.arbeitsagentur.de/design/dpl/assets/3.7.0/fonts/roboto-v20-latin-ext-regular.woff2) format("woff2"),url(https://web.arbeitsagentur.de/design/dpl/assets/3.7.0/fonts/roboto-v20-latin-ext-regular.woff) format("woff"),url(https://web.arbeitsagentur.de/design/dpl/assets/3.7.0/fonts/roboto-v20-latin-ext-regular.ttf) format("truetype"),url(https://web.arbeitsagentur.de/design/dpl/assets/3.7.0/fonts/roboto-v20-latin-ext-regular.svg#Roboto) format("svg")}:root{--ba-mobile-scroll-padding-top:58px;--ba-desktop-scroll-padding-top:96px}html,body{min-height:100%}html{scroll-padding-top:var(--ba-mobile-scroll-padding-top)}@media (width >= 768px) and (orientation: portrait),(width >= 992px) and (orientation: landscape){html{scroll-padding-top:var(--ba-desktop-scroll-padding-top)}}body{font-family:Roboto,Helvetica Neue,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"}@media (width <= 767px) and (orientation: portrait),(width <= 991px) and (orientation: landscape){body{margin-top:53px}}body:not(.ba-keyboard-mode) :focus{outline:none}@media (-ms-high-contrast: active),(forced-colors: active),(prefers-contrast: more){body:not(.ba-keyboard-mode) :focus{outline:auto}}:root{--container-fluid-max-width:1440px}</style><link rel="stylesheet" href="styles.fdb7ccdcbe49b5bc.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles.fdb7ccdcbe49b5bc.css"></noscript></head>
<body>
<!--self closing tags (<jb-root/>) brechen SSR. dh hier so lassen-->
<jb-root></jb-root>
<script src="runtime.c71911d7ef9e1973.js" type="module"></script><script src="polyfills.1026555adb61a641.js" type="module"></script><script src="scripts.34267ce646edbb35.js" defer=""></script><script src="main.db2b000eb61cd2be.js" type="module"></script>

</body></html>
Original Content

@Spixmaster
Copy link
Author

@canadaduane Do you have expertise to this issue?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants