/** * Copyright 2017 Google Inc. All rights reserved. * Modifications copyright (c) Microsoft Corporation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { test as it, expect } from './pageTest'; const expectedOutput = '
hello
'; it('should work', async ({ page, server }) => { await page.setContent('
hello
'); const result = await page.content(); expect(result).toBe(expectedOutput); }); it('should work with domcontentloaded', async ({ page, server }) => { await page.setContent('
hello
', { waitUntil: 'domcontentloaded' }); const result = await page.content(); expect(result).toBe(expectedOutput); }); it('should work with doctype', async ({ page, server }) => { const doctype = ''; await page.setContent(`${doctype}
hello
`); const result = await page.content(); expect(result).toBe(`${doctype}${expectedOutput}`); }); it('should work with HTML 4 doctype', async ({ page, server }) => { const doctype = ''; await page.setContent(`${doctype}
hello
`); const result = await page.content(); expect(result).toBe(`${doctype}${expectedOutput}`); }); it('should respect timeout', async ({ page, server, playwright }) => { const imgPath = '/img.png'; // stall for image server.setRoute(imgPath, (req, res) => {}); let error = null; await page.setContent(``, { timeout: 1 }).catch(e => error = e); expect(error).toBeInstanceOf(playwright.errors.TimeoutError); }); it('should respect default navigation timeout', async ({ page, server, playwright }) => { page.setDefaultNavigationTimeout(1); const imgPath = '/img.png'; // stall for image server.setRoute(imgPath, (req, res) => {}); const error = await page.setContent(``).catch(e => e); expect(error.message).toContain('page.setContent: Timeout 1ms exceeded.'); expect(error).toBeInstanceOf(playwright.errors.TimeoutError); }); it('should await resources to load', async ({ page, server }) => { const imgPath = '/img.png'; let imgResponse = null; server.setRoute(imgPath, (req, res) => imgResponse = res); let loaded = false; const contentPromise = page.setContent(``).then(() => loaded = true); await server.waitForRequest(imgPath); expect(loaded).toBe(false); imgResponse.end(); await contentPromise; }); it('should work fast enough', async ({ page, server }) => { for (let i = 0; i < 20; ++i) await page.setContent('
yo
'); }); it('should work with tricky content', async ({ page, server }) => { await page.setContent('
hello world
' + '\x7F'); expect(await page.$eval('div', div => div.textContent)).toBe('hello world'); }); it('should work with accents', async ({ page, server }) => { await page.setContent('
aberración
'); expect(await page.$eval('div', div => div.textContent)).toBe('aberración'); }); it('should work with emojis', async ({ page, server }) => { await page.setContent('
🐥
'); expect(await page.$eval('div', div => div.textContent)).toBe('🐥'); }); it('should work with newline', async ({ page, server }) => { await page.setContent('
\n
'); expect(await page.$eval('div', div => div.textContent)).toBe('\n'); }); it('content() should throw nice error during navigation', async ({ page, server }) => { for (let timeout = 0; timeout < 200; timeout += 20) { await page.setContent('
hello
'); const promise = page.goto(server.EMPTY_PAGE); await page.waitForTimeout(timeout); const [contentOrError] = await Promise.all([ page.content().catch(e => e), promise, ]); const emptyOutput = ''; if (contentOrError !== expectedOutput && contentOrError !== emptyOutput) expect(contentOrError?.message).toContain('Unable to retrieve content because the page is navigating and changing the content.'); } });