Playwright-JavaScript-Ausführung
Dieses Kapitel führt ein, wie JavaScript-Code in Playwright ausgeführt wird, einschließlich Ausführung im Seitenkontext, Parameterübergabe und initialer Skriptinjektion.
page.evaluate() Ausführung im Seitenkontext
page.evaluate()Führt Code in der JavaScript-Umgebung der Seite aus, mit Zugriff auf das DOM und globale Variablen der Seite.
Beispiel
await page.goto('https://www.example.com/');
// Seitentitel abrufen (im Seitenkontext ausgeführt)
const title = await page.evaluate(() => {
return document.title;
});
console.log('Seitentitel:', title);
// Anzahl aller Links auf der Seite abrufen
const linkCount = await page.evaluate(() => {
return document.querySelectorAll('a').length;
});
console.log('Anzahl der Links:', linkCount);
// Bildlaufposition der Seite abrufen
const scrollY = await page.evaluate(() => {
return window.scrollY;
});
});
Parameter an evaluate übergeben
page.evaluate()Sein zweiter Parameter wird an die Funktion innerhalb der Seite übergeben.
Beispiel
await page.goto('https://www.example.com/');
// Einen einzelnen Parameter übergeben
const result1 = await page.evaluate((name) => {
return `Hello, ${name}!`;
}, 'BEISPIEL');
// Ein Objekt als Parameter übergeben
const userInfo = { name: 'example', role: 'admin' };
const result2 = await page.evaluate((user) => {
return `${user.name}Seine Rolle ist ${user.role}`;
}, userInfo);
// Mehrere Parameter übergeben (mit Destrukturierung)
const result3 = await page.evaluate(
({ x, y }) => {
return x + y;
},
{ x: 10, y: 20 }
);
console.log('10 + 20 =', result3); // 30
});
Die übergebenen Parameter werden JSON-serialisiert und an den Seitenkontext übergeben; nicht serialisierbare Werte wie Funktionen und DOM-Elemente können nicht übergeben werden.
Der zurückgegebene Wert wird ebenfalls serialisiert.
locator.evaluate() Elementkontext-Ausführung
locator.evaluate()Code im Kontext des gefundenen Elements ausführen; der Parameter enthält eine Referenz auf den DOM-Knoten dieses Elements.
Beispiel
await page.goto('https://www.example.com/');
// textContent eines bestimmten Elements abrufen
const text = await page
.getByRole('heading', { name: 'EXAMPLE' })
.evaluate(node => node.textContent);
// Das style-Attribut des Elements abrufen
const color = await page
.getByRole('button', { name: 'Search' })
.evaluate(node => getComputedStyle(node).backgroundColor);
});
locator.evaluateAll() Iterieren über alle übereinstimmenden Elemente
evaluateAll()Führt denselben Code für alle übereinstimmenden Elemente aus und gibt ein Array zurück.
Beispiel
await page.goto('https://www.example.com/');
// Den Text aller Menüeinträge abrufen
const menuItems = await page
.getByRole('navigation')
.locator('a')
.evaluateAll(links => links.map(link => link.textContent));
console.log('Menüpunkte:', menuItems);
// ['Startseite', 'Tutorial', 'Werkzeuge', ...]
});
page.addInitScript() Initiale Skripte injizieren
addInitScript()JavaScript-Code vor dem Laden der Seite injizieren, derbevor die Seitenskripte ausgeführt werdendie Browserumgebung verändern kann.
Beispiel
// Die navigator-Eigenschaft vor dem Laden der Seite ändern
await page.addInitScript(() => {
// WebDriver-Erkennung überschreiben
Object.defineProperty(navigator, 'webdriver', {
get: () => false,
});
// Globale Variablen auf window mocken
window.EXAMPLE_CONFIG = {
env: 'test',
version: '1.0.0',
};
});
await page.goto('https://www.example.com/');
// Überprüfen, dass die injizierten Variablen wirksam werden
const config = await page.evaluate(() => window.EXAMPLE_CONFIG);
console.log(config); // { env: 'test', version: '1.0.0' }
});
addInitScript()Häufige Anwendungsfälle:
| Anwendungsfall | Beschreibung |
|---|---|
| Browser-API mocken | Überschreibennavigator.webdriver、navigator.languagewarten |
| Benutzerdefinierte Konfiguration injizieren | Testumgebungsvariablen setzen, Datenquellen mocken usw. |
| Funktionen deaktivieren | Service Worker deaktivieren, Logging deaktivieren usw. |
| Polyfill | Funktionalität hinzufügen, von der die Seite abhängt, die aber in der Testumgebung fehlt. |
Verwendung und Einschränkungen von ElementHandle
ElementHandle ist eine direkte Referenz auf ein DOM-Element und wurde in frühen Versionen von Playwright häufig verwendet.
In den meisten Szenarien sollten Sie jetztLocatoranstelle von ElementHandle verwenden.
Beispiel
const handle = await page.$('.my-element');
await handle.click();
// Locator-Ansatz (neuer Stil, empfohlen)
await page.locator('.my-element').click();
ElementHandle wird nur verwendet, wenn Sie etwas abrufen müssenboundingBox()oder bei der Durchführung komplexer DOM-Operationen.