mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-05-12 16:56:23 +00:00
## Summary Assorted website copy and content refinements — tidying up loose ends across the site. ## Changes - **What**: Remove placeholder doc links from custom nodes feature description on pricing page ## Review Focus Low-risk copy changes only; no logic or layout modifications. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-11552-feat-website-website-mise-en-place-34b6d73d3650813b954afbc965e4dc74) by [Unito](https://www.unito.io) > **Note:** The `PR: Vercel Website Preview` workflow is `workflow_run`-triggered, so it always runs the **main branch version** of the workflow file. Until this PR is merged, the preview workflow will continue posting standalone comments using the old `<!-- VERCEL_WEBSITE_PREVIEW -->` marker instead of writing to the consolidated `<!-- WEBSITE_CI_REPORT -->` comment. This is expected and resolves itself on merge. --------- Co-authored-by: Amp <amp@ampcode.com> Co-authored-by: github-actions <github-actions@github.com> Co-authored-by: Yourz <crazilou@vip.qq.com>
146 lines
4.4 KiB
TypeScript
146 lines
4.4 KiB
TypeScript
import type { Page } from '@playwright/test'
|
|
|
|
import { expect } from '@playwright/test'
|
|
|
|
import { test } from './fixtures/blockExternalMedia'
|
|
import { VIEWPORTS } from './viewports'
|
|
|
|
test.describe.configure({ timeout: 60_000 })
|
|
|
|
const SMALL_VIEWPORTS = VIEWPORTS.filter(
|
|
(v) => v.name === '1-sm' || v.name === '2-md'
|
|
)
|
|
|
|
async function assertNoOverflow(page: Page) {
|
|
await expect
|
|
.poll(
|
|
() =>
|
|
page.evaluate(
|
|
() =>
|
|
document.documentElement.scrollWidth >
|
|
document.documentElement.clientWidth
|
|
),
|
|
{ message: 'page has horizontal overflow', timeout: 5_000 }
|
|
)
|
|
.toBe(false)
|
|
}
|
|
|
|
async function navigateAndSettle(page: Page, url: string) {
|
|
await page.goto(url)
|
|
await page.waitForLoadState('networkidle')
|
|
}
|
|
|
|
test.describe('Home', { tag: '@visual' }, () => {
|
|
for (const vp of VIEWPORTS) {
|
|
test.describe(vp.name, () => {
|
|
test.beforeEach(async ({ page }) => {
|
|
await page.setViewportSize({ width: vp.width, height: vp.height })
|
|
await navigateAndSettle(page, '/')
|
|
})
|
|
|
|
test('product-cards screenshot', async ({ page }) => {
|
|
const section = page.locator('section', {
|
|
has: page.getByRole('heading', { name: /The AI creation/i })
|
|
})
|
|
await expect(section).toBeVisible()
|
|
await section.scrollIntoViewIfNeeded()
|
|
await expect(page).toHaveScreenshot(`home-product-cards-${vp.name}.png`)
|
|
})
|
|
|
|
test('get-started screenshot', async ({ page }) => {
|
|
const section = page.locator('section', {
|
|
has: page.getByRole('heading', { name: /Get started/i })
|
|
})
|
|
await expect(section).toBeVisible()
|
|
await section.scrollIntoViewIfNeeded()
|
|
await expect(page).toHaveScreenshot(`home-get-started-${vp.name}.png`)
|
|
})
|
|
})
|
|
}
|
|
})
|
|
|
|
test.describe('Pricing', { tag: '@visual' }, () => {
|
|
for (const vp of VIEWPORTS) {
|
|
test(`pricing-tiers-${vp.name}`, async ({ page }) => {
|
|
await page.setViewportSize({ width: vp.width, height: vp.height })
|
|
await navigateAndSettle(page, '/cloud/pricing')
|
|
await assertNoOverflow(page)
|
|
|
|
const section = page.locator('section', {
|
|
has: page.getByRole('heading', { name: /Pricing/i })
|
|
})
|
|
await expect(section).toBeVisible()
|
|
await section.scrollIntoViewIfNeeded()
|
|
await expect(page).toHaveScreenshot(`pricing-tiers-${vp.name}.png`)
|
|
})
|
|
}
|
|
})
|
|
|
|
test.describe('Contact', { tag: '@visual' }, () => {
|
|
for (const vp of SMALL_VIEWPORTS) {
|
|
test(`form-${vp.name}`, async ({ page }) => {
|
|
await page.setViewportSize({ width: vp.width, height: vp.height })
|
|
await navigateAndSettle(page, '/contact')
|
|
|
|
const section = page.locator('section', {
|
|
has: page.getByRole('heading', { name: /Create powerful workflows/i })
|
|
})
|
|
await expect(section).toBeVisible()
|
|
await section.scrollIntoViewIfNeeded()
|
|
await expect(page).toHaveScreenshot(`contact-form-${vp.name}.png`)
|
|
})
|
|
}
|
|
})
|
|
|
|
test.describe('Gallery', { tag: '@visual' }, () => {
|
|
for (const vp of SMALL_VIEWPORTS) {
|
|
test(`gallery-grid-${vp.name}`, async ({ page }) => {
|
|
await page.setViewportSize({ width: vp.width, height: vp.height })
|
|
await navigateAndSettle(page, '/gallery')
|
|
|
|
const section = page.getByTestId('gallery-grid')
|
|
await expect(section).toBeVisible()
|
|
await section.scrollIntoViewIfNeeded()
|
|
await expect(page).toHaveScreenshot(`gallery-grid-${vp.name}.png`)
|
|
})
|
|
}
|
|
})
|
|
|
|
test.describe('About', { tag: '@visual' }, () => {
|
|
for (const vp of SMALL_VIEWPORTS) {
|
|
test(`hero-${vp.name}`, async ({ page }) => {
|
|
await page.setViewportSize({ width: vp.width, height: vp.height })
|
|
await navigateAndSettle(page, '/about')
|
|
|
|
const hero = page.locator('section', {
|
|
has: page.getByRole('heading', { name: /Build the tools/i })
|
|
})
|
|
await expect(hero).toBeVisible()
|
|
await hero.scrollIntoViewIfNeeded()
|
|
await expect(page).toHaveScreenshot(`about-hero-${vp.name}.png`)
|
|
})
|
|
}
|
|
})
|
|
|
|
test.describe('Overflow guards', { tag: '@visual' }, () => {
|
|
const pages = [
|
|
'/',
|
|
'/cloud',
|
|
'/cloud/pricing',
|
|
'/contact',
|
|
'/download',
|
|
'/gallery',
|
|
'/about',
|
|
'/careers'
|
|
]
|
|
for (const url of pages) {
|
|
for (const vp of VIEWPORTS) {
|
|
test(`${url} ${vp.name} no overflow`, async ({ page }) => {
|
|
await page.setViewportSize({ width: vp.width, height: vp.height })
|
|
await page.goto(url)
|
|
await assertNoOverflow(page)
|
|
})
|
|
}
|
|
}
|
|
})
|