| import { expect, Page } from '@playwright/test'; | |
| export class ArtifactPage { | |
| constructor(private page: Page) {} | |
| public get artifact() { | |
| return this.page.getByTestId('artifact'); | |
| } | |
| public get sendButton() { | |
| return this.artifact.getByTestId('send-button'); | |
| } | |
| public get stopButton() { | |
| return this.page.getByTestId('stop-button'); | |
| } | |
| public get multimodalInput() { | |
| return this.page.getByTestId('multimodal-input'); | |
| } | |
| async isGenerationComplete() { | |
| const response = await this.page.waitForResponse((response) => | |
| response.url().includes('/api/chat'), | |
| ); | |
| await response.finished(); | |
| } | |
| async sendUserMessage(message: string) { | |
| await this.artifact.getByTestId('multimodal-input').click(); | |
| await this.artifact.getByTestId('multimodal-input').fill(message); | |
| await this.artifact.getByTestId('send-button').click(); | |
| } | |
| async getRecentAssistantMessage() { | |
| const messageElements = await this.artifact | |
| .getByTestId('message-assistant') | |
| .all(); | |
| const lastMessageElement = messageElements[messageElements.length - 1]; | |
| const content = await lastMessageElement | |
| .getByTestId('message-content') | |
| .innerText() | |
| .catch(() => null); | |
| const reasoningElement = await lastMessageElement | |
| .getByTestId('message-reasoning') | |
| .isVisible() | |
| .then(async (visible) => | |
| visible | |
| ? await lastMessageElement | |
| .getByTestId('message-reasoning') | |
| .innerText() | |
| : null, | |
| ) | |
| .catch(() => null); | |
| return { | |
| element: lastMessageElement, | |
| content, | |
| reasoning: reasoningElement, | |
| async toggleReasoningVisibility() { | |
| await lastMessageElement | |
| .getByTestId('message-reasoning-toggle') | |
| .click(); | |
| }, | |
| }; | |
| } | |
| async getRecentUserMessage() { | |
| const messageElements = await this.artifact | |
| .getByTestId('message-user') | |
| .all(); | |
| const lastMessageElement = messageElements[messageElements.length - 1]; | |
| const content = await lastMessageElement.innerText(); | |
| const hasAttachments = await lastMessageElement | |
| .getByTestId('message-attachments') | |
| .isVisible() | |
| .catch(() => false); | |
| const attachments = hasAttachments | |
| ? await lastMessageElement.getByTestId('message-attachments').all() | |
| : []; | |
| const page = this.artifact; | |
| return { | |
| element: lastMessageElement, | |
| content, | |
| attachments, | |
| async edit(newMessage: string) { | |
| await page.getByTestId('message-edit-button').click(); | |
| await page.getByTestId('message-editor').fill(newMessage); | |
| await page.getByTestId('message-editor-send-button').click(); | |
| await expect( | |
| page.getByTestId('message-editor-send-button'), | |
| ).not.toBeVisible(); | |
| }, | |
| }; | |
| } | |
| async closeArtifact() { | |
| return this.page.getByTestId('artifact-close-button').click(); | |
| } | |
| } | |