/** * Die Navigationssperre am laufenden Programm. * * Eigene Datei mit eigener Anwendungsinstanz, und das mit Grund: Eine * abgebrochene Navigation gilt für Playwright weiterhin als laufend. Jeder * Locator, der danach in derselben Seite benutzt wird – auch in einem * späteren Test –, läuft in die Zeitüberschreitung. Die Instanz wird deshalb * nach diesem Test verworfen. */ import { type ElectronApplication, type Page } from '@playwright/test'; import { appStarten, bauPruefen } from './electron-hilfe'; import { expect, konsoleErwartet, test } from './konsolenwache'; // `undefined`, solange der beforeAll-Hook übersprungen wurde. let app: ElectronApplication | undefined; let fenster: Page; test.beforeAll(async () => { // Fehlender oder veralteter Bau ist ein Fehler, kein Grund zum Schweigen. bauPruefen(); ({ app, fenster } = await appStarten()); }); test.afterAll(async () => { await app?.close(); }); test('lässt den Renderer nicht auf eine fremde Datei navigieren', async () => { /* Das Protokoll `file:` allein darf nicht genügen: Das Preload-Skript hängt am `webContents` und würde auch für die neue Seite wieder eingespielt. Eine heruntergeladene HTML-Datei hätte damit die volle Bridge in der Hand. */ const vorher = fenster.url(); /* Der Hauptprozess schreibt jede abgewiesene Navigation in die Konsole (`src/main/sicherheit.ts`). Hier ist diese Warnung kein Mangel, sondern der Beleg, dass die Sperre gegriffen hat – überall sonst wäre sie ein Alarm, deshalb gilt die Anmeldung nur für diesen Test. */ konsoleErwartet( /^\[sicherheit\] Navigation blockiert: file:\/\/\/C:\/Windows\/win\.ini$/u, 'Genau diese Navigation löst der Test absichtlich aus; die Warnung ist ihr Beleg.', ); await fenster.evaluate(() => { globalThis.location.href = 'file:///C:/Windows/win.ini'; }); // Kurz warten: Eine Navigation bräuchte einen Moment; die Sperre nicht. await fenster.waitForTimeout(500); expect(fenster.url()).toBe(vorher); /* Bewusst über `evaluate` statt über einen Locator – siehe Dateikopf. */ const ueberschrift = await fenster.evaluate( () => document.querySelector('h1')?.textContent ?? '', ); expect(ueberschrift).toBe('Waffensachkunde – Lernsoftware'); const bruecke = await fenster.evaluate( () => typeof (globalThis as Record)['lernApp'], ); expect(bruecke).toBe('object'); });