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

feat(browser): playwright provider doesn't allow resizing the browser viewport #5984

Merged
merged 12 commits into from
Jul 1, 2024
Merged
25 changes: 20 additions & 5 deletions packages/browser/src/node/providers/playwright.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import type {
Browser,

BrowserContext,
BrowserContextOptions,
Frame,
Expand Down Expand Up @@ -67,10 +66,22 @@ export class PlaywrightBrowserProvider implements BrowserProvider {

const playwright = await import('playwright')

const browser = await playwright[this.browserName].launch({
const launchOptions = {
...this.options?.launch,
headless: options.headless,
})
} satisfies LaunchOptions

// start Vitest UI maximized only on supported browsers
if (this.ctx.config.browser.ui && this.browserName === 'chromium') {
if (!launchOptions.args) {
launchOptions.args = []
}
if (!launchOptions.args.includes('--start-maximized') && !launchOptions.args.includes('--start-fullscreen')) {
launchOptions.args.push('--start-maximized')
}
}

const browser = await playwright[this.browserName].launch(launchOptions)
this.browser = browser
this.browserPromise = null
return this.browser
Expand All @@ -85,11 +96,15 @@ export class PlaywrightBrowserProvider implements BrowserProvider {
}

const browser = await this.openBrowser()
const context = await browser.newContext({
const options = {
...this.options?.context,
ignoreHTTPSErrors: true,
serviceWorkers: 'allow',
})
} satisfies BrowserContextOptions
if (this.ctx.config.browser.ui) {
options.viewport = null
}
const context = await browser.newContext(options)
this.contexts.set(contextId, context)
return context
}
Expand Down
13 changes: 13 additions & 0 deletions packages/browser/src/node/providers/webdriver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,19 @@ export class WebdriverBrowserProvider implements BrowserProvider {
capabilities[key] = { ...currentValues, args: newArgs as any }
}

// start Vitest UI maximized only on supported browsers
if (options.ui && (browser === 'chrome' || browser === 'edge')) {
const key = browser === 'chrome'
? 'goog:chromeOptions'
: 'ms:edgeOptions'
const args = capabilities[key]?.args || []
if (!args.includes('--start-maximized') && !args.includes('--start-fullscreen')) {
args.push('--start-maximized')
}
capabilities[key] ??= {}
capabilities[key]!.args = args
}

return capabilities
}

Expand Down
4 changes: 2 additions & 2 deletions test/browser/specs/runner.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ describe('running browser tests', async () => {
console.error(stderr)
})

expect(browserResultJson.testResults).toHaveLength(18)
expect(passedTests).toHaveLength(16)
expect(browserResultJson.testResults).toHaveLength(19)
expect(passedTests).toHaveLength(17)
expect(failedTests).toHaveLength(2)

expect(stderr).not.toContain('has been externalized for browser compatibility')
Expand Down
27 changes: 27 additions & 0 deletions test/browser/test/viewport.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { page, server } from '@vitest/browser/context'
import { describe, expect, it } from 'vitest'

describe.skipIf(server.provider === 'preview')('viewport window has been properly initialized', () => {
it.skipIf(!page.config.browser.headless)('viewport has proper size', () => {
const { width, height } = page.config.browser.viewport
const { width: actualWidth, height: actualHeight } = window.document.documentElement.getBoundingClientRect()

expect(actualWidth).toBe(width)
expect(actualHeight).toBe(height)
})

it.skipIf(page.config.browser.headless)('window has been maximized', () => {
let topWindow = window
while (topWindow.parent && topWindow !== topWindow.parent) {
topWindow = topWindow.parent as unknown as any
}

// edge will show the Hub Apps right panel
if (server.browser === 'edge') {
expect(topWindow.visualViewport.width - topWindow.innerWidth === 0).toBe(true)
}
else {
expect(screen.availWidth - topWindow.innerWidth === 0).toBe(true)
}
})
})
Loading