|
|
@@ -113,106 +113,96 @@ test('registers an execution node, downloads its private config and disables it'
|
|
|
expect((await (await page.request.get('/api/app/admin/runners')).json()).runners.find((r:any)=>r.id===configuration.runnerId).enabled).toBe(false)
|
|
|
})
|
|
|
|
|
|
-test('explains isolated execution and keeps the edit form intact when a computer Runner is missing',async({page},testInfo)=>{
|
|
|
- await page.goto('/conversations')
|
|
|
- await page.getByRole('textbox',{name:'账号',exact:true}).fill('fixture')
|
|
|
- await page.getByRole('textbox',{name:'密码',exact:true}).fill('fixture-pass')
|
|
|
- await page.getByRole('button',{name:'登录',exact:true}).click()
|
|
|
- await page.locator('.desktop-sidebar .sidebar-create-trigger').click()
|
|
|
- await page.getByRole('menuitem',{name:'新建 Bot',exact:true}).click()
|
|
|
- const dialog=page.getByRole('dialog')
|
|
|
- await dialog.getByRole('textbox',{name:'名称',exact:true}).fill('浏览器隔离成员')
|
|
|
- await dialog.getByRole('combobox',{name:'执行环境',exact:true}).selectOption('computer')
|
|
|
- await expect(dialog).toContainText('联网范围由执行节点的配置决定')
|
|
|
- await dialog.getByRole('button',{name:'保存',exact:true}).click()
|
|
|
- await expect(dialog.getByText(/隔离电脑需要连接执行节点/)).toBeVisible()
|
|
|
- await expect(dialog).toBeVisible()
|
|
|
- await expect(dialog.getByRole('combobox',{name:'执行环境',exact:true})).toHaveValue('computer')
|
|
|
- await page.setViewportSize({width:390,height:844})
|
|
|
- await dialog.getByRole('combobox',{name:'执行环境',exact:true}).scrollIntoViewIfNeeded()
|
|
|
- await page.screenshot({path:testInfo.outputPath('computer-execution-mobile.png')})
|
|
|
-})
|
|
|
-
|
|
|
-test('computer viewing is read-only until takeover and returns control with a user note',async({page},testInfo)=>{
|
|
|
- await page.goto('/conversations')
|
|
|
- await page.getByRole('textbox',{name:'账号',exact:true}).fill('fixture')
|
|
|
- await page.getByRole('textbox',{name:'密码',exact:true}).fill('fixture-pass')
|
|
|
- await page.getByRole('button',{name:'登录',exact:true}).click()
|
|
|
- await expect(page.locator('.desktop-sidebar .sidebar-create-trigger')).toBeVisible()
|
|
|
- const seeded=await page.request.post('/__test/computer',{data:{}});expect(seeded.ok(),await seeded.text()).toBe(true)
|
|
|
- const fixture=await seeded.json();expect(fixture.conversationId).toBeTruthy()
|
|
|
- await page.goto(`/conversations/${fixture.conversationId}`)
|
|
|
- await page.getByRole('button',{name:'电脑',exact:true}).click()
|
|
|
- const panel=page.getByRole('dialog',{name:'隔离电脑',exact:true}),screen=panel.getByRole('img',{name:'隔离电脑当前画面'})
|
|
|
- await expect(screen).toBeVisible()
|
|
|
- await screen.click()
|
|
|
- expect((await (await page.request.get('/__test/computer')).json()).actions).toEqual([])
|
|
|
- await panel.getByRole('button',{name:'接管电脑',exact:true}).click()
|
|
|
- await expect(panel).toContainText('人工控制中')
|
|
|
- await panel.getByRole('textbox',{name:'输入到电脑',exact:true}).fill('人工输入验收')
|
|
|
- await panel.getByRole('button',{name:'输入文字',exact:true}).click()
|
|
|
- await expect.poll(async()=>(await (await page.request.get('/__test/computer')).json()).actions).toEqual([{kind:'text',text:'人工输入验收'}])
|
|
|
- await panel.getByRole('textbox',{name:'交还说明',exact:true}).fill('已完成设置,请继续任务')
|
|
|
- await page.setViewportSize({width:390,height:844})
|
|
|
- await panel.getByRole('button',{name:'交还 Agent 并继续',exact:true}).scrollIntoViewIfNeeded()
|
|
|
- await page.screenshot({path:testInfo.outputPath('computer-panel-mobile.png')})
|
|
|
- await panel.getByRole('button',{name:'交还 Agent 并继续',exact:true}).click()
|
|
|
- await expect(panel.getByRole('button',{name:'接管电脑',exact:true})).toBeVisible()
|
|
|
- await panel.getByRole('button',{name:'关闭',exact:true}).click()
|
|
|
- await expect(panel).not.toBeVisible()
|
|
|
+test('configures the Agent computer in its chat panel and keeps preparation in app settings',async({page},testInfo)=>{
|
|
|
+ await page.goto('/conversations')
|
|
|
+ await page.getByRole('textbox',{name:'账号',exact:true}).fill('fixture');await page.getByRole('textbox',{name:'密码',exact:true}).fill('fixture-pass');await page.getByRole('button',{name:'登录',exact:true}).click()
|
|
|
+ await page.locator('.desktop-sidebar .sidebar-create-trigger').click();await page.getByRole('menuitem',{name:'新建 Bot',exact:true}).click()
|
|
|
+ const editor=page.getByRole('dialog');await editor.getByRole('textbox',{name:'名称',exact:true}).fill('尚未配置的本地电脑')
|
|
|
+ await expect(editor.getByRole('combobox',{name:'执行环境'})).toHaveCount(0)
|
|
|
+ await editor.getByRole('button',{name:'保存',exact:true}).click()
|
|
|
+ await page.getByRole('button',{name:'电脑',exact:true}).click()
|
|
|
+ const dock=page.getByRole('complementary',{name:'Agent 电脑面板'})
|
|
|
+ await dock.getByRole('combobox',{name:'此 Agent 使用的电脑'}).selectOption('vm')
|
|
|
+ await expect(dock.getByRole('button',{name:'设置本地虚拟机',exact:true})).toBeVisible()
|
|
|
+ await page.screenshot({path:testInfo.outputPath('local-vm-unconfigured-agent.png')})
|
|
|
})
|
|
|
|
|
|
+async function login(page:any,ready=false){
|
|
|
+ await page.goto('/conversations');await page.getByRole('textbox',{name:'账号',exact:true}).fill('fixture');await page.getByRole('textbox',{name:'密码',exact:true}).fill('fixture-pass');await page.getByRole('button',{name:'登录',exact:true}).click()
|
|
|
+ await expect(page.locator('.desktop-sidebar .sidebar-create-trigger')).toBeVisible()
|
|
|
+ await page.request.post('/__test/local-vm'+(ready?'?ready=1':''),{data:{}})
|
|
|
+}
|
|
|
|
|
|
-test('trusted shared computers require an explicit data-sharing grant and can be detached',async({page},testInfo)=>{
|
|
|
- await page.goto('/conversations')
|
|
|
- await page.getByRole('textbox',{name:'账号',exact:true}).fill('fixture')
|
|
|
- await page.getByRole('textbox',{name:'密码',exact:true}).fill('fixture-pass')
|
|
|
- await page.getByRole('button',{name:'登录',exact:true}).click()
|
|
|
- await expect(page.locator('.desktop-sidebar .sidebar-create-trigger')).toBeVisible()
|
|
|
- const seeded=await page.request.post('/__test/computer?shared=1',{data:{}});expect(seeded.ok(),await seeded.text()).toBe(true)
|
|
|
- const fixture=await seeded.json();await page.goto(`/conversations/${fixture.conversationId}`)
|
|
|
- await page.getByRole('button',{name:'电脑',exact:true}).click()
|
|
|
- const panel=page.getByRole('dialog',{name:'隔离电脑',exact:true})
|
|
|
- await panel.getByRole('button',{name:'电脑共享设置',exact:true}).click()
|
|
|
- const create=panel.getByRole('button',{name:'创建可信共享电脑',exact:true})
|
|
|
- await expect(create).toBeDisabled()
|
|
|
- await panel.getByRole('checkbox',{name:'我确认这些成员可以访问同一工作区和浏览器登录资料'}).check()
|
|
|
- await create.click()
|
|
|
- await expect(panel).toContainText('共享电脑:团队共享电脑')
|
|
|
- await page.setViewportSize({width:390,height:844})
|
|
|
- await panel.getByRole('button',{name:'电脑共享设置',exact:true}).click()
|
|
|
- await panel.getByRole('button',{name:'解除这台电脑的共享',exact:true}).scrollIntoViewIfNeeded()
|
|
|
- await page.screenshot({path:testInfo.outputPath('shared-computer-mobile.png')})
|
|
|
- await panel.getByRole('button',{name:'解除这台电脑的共享',exact:true}).click()
|
|
|
- await expect(panel).not.toContainText('共享电脑:团队共享电脑')
|
|
|
- const agents=(await (await page.request.get('/api/app/agents')).json()).agents
|
|
|
- expect(agents.find((agent:any)=>agent.id===fixture.agentId).computerEnvironmentId).toBeUndefined()
|
|
|
+test('Local VM settings replace the image catalog and prepare the managed desktop',async({page},testInfo)=>{
|
|
|
+ await login(page)
|
|
|
+ await expect(page.getByRole('button',{name:'电脑与环境',exact:true})).toHaveCount(0)
|
|
|
+ await page.getByRole('button',{name:'设置与模式',exact:true}).first().click()
|
|
|
+ await page.getByRole('menuitem',{name:'进入设置',exact:true}).click()
|
|
|
+ const settings=page.getByRole('dialog',{name:'设置中心'})
|
|
|
+ await settings.getByRole('button',{name:'本地虚拟机',exact:true}).click()
|
|
|
+ const panel=settings.getByRole('region',{name:'本地虚拟机设置'})
|
|
|
+ await expect(panel).toContainText('隔离方式')
|
|
|
+ await expect(panel.getByRole('button',{name:'上传并导入'})).toHaveCount(0)
|
|
|
+ await panel.getByRole('button',{name:'准备本地虚拟机',exact:true}).click()
|
|
|
+ await expect(panel).toContainText('虚拟机环境已就绪')
|
|
|
+ await panel.getByRole('combobox',{name:'虚拟机数量上限'}).selectOption('3')
|
|
|
+ await expect(panel.getByRole('combobox',{name:'虚拟机数量上限'})).toHaveValue('3')
|
|
|
+ await panel.getByRole('heading',{name:'本地虚拟机',exact:true}).scrollIntoViewIfNeeded()
|
|
|
+ await page.screenshot({path:testInfo.outputPath('local-vm-settings.png')})
|
|
|
+ expect((await page.request.get('/api/app/admin/runners/11111111-1111-4111-8111-111111111111/images')).status()).toBe(404)
|
|
|
})
|
|
|
|
|
|
+test('Agent computer appears as a right panel and opens an interactive desktop',async({page},testInfo)=>{
|
|
|
+ await login(page)
|
|
|
+ const seed=await(await page.request.post('/__test/computer?off=1',{data:{}})).json()
|
|
|
+ await page.goto(`/conversations/${seed.conversationId}`)
|
|
|
+ await page.getByRole('button',{name:'电脑',exact:true}).click()
|
|
|
+ const dock=page.getByRole('complementary',{name:'Agent 电脑面板'})
|
|
|
+ await expect(dock).toBeVisible();await expect(dock).toContainText('本地虚拟机')
|
|
|
+ await dock.getByRole('button',{name:'设置本地虚拟机',exact:true}).click()
|
|
|
+ const settings=page.getByRole('dialog',{name:'设置中心'})
|
|
|
+ await settings.getByRole('button',{name:'准备本地虚拟机',exact:true}).click()
|
|
|
+ await settings.getByRole('button',{name:'关闭设置中心',exact:true}).click()
|
|
|
+ await expect(dock.getByRole('button',{name:/创建.*的虚拟机/})).toBeVisible({timeout:12000})
|
|
|
+ await dock.getByRole('button',{name:/创建.*的虚拟机/}).click()
|
|
|
+ await expect(dock.getByRole('img')).toBeVisible()
|
|
|
+ const bounds=await dock.boundingBox();expect(bounds!.x).toBeGreaterThan(500)
|
|
|
+ await page.screenshot({path:testInfo.outputPath('agent-local-vm-panel.png')})
|
|
|
+ expect((await(await page.request.get('/__test/computer')).json()).actions).toEqual([])
|
|
|
+ await dock.getByRole('button',{name:'打开桌面',exact:true}).click()
|
|
|
+ const viewer=page.getByRole('dialog',{name:'隔离电脑',exact:true})
|
|
|
+ await expect(viewer).toContainText('人工控制中')
|
|
|
+ await viewer.getByRole('button',{name:'键盘与操作',exact:true}).click()
|
|
|
+ await viewer.getByRole('textbox',{name:'输入到电脑',exact:true}).fill('本地虚拟机交互验收')
|
|
|
+ await viewer.getByRole('button',{name:'输入文字',exact:true}).click()
|
|
|
+ await expect.poll(async()=>(await(await page.request.get('/__test/computer')).json()).actions).toEqual([{kind:'text',text:'本地虚拟机交互验收'}])
|
|
|
+ await viewer.getByRole('img').dblclick()
|
|
|
+ await expect.poll(async()=>(await(await page.request.get('/__test/computer')).json()).actions.filter((a:any)=>a.kind==='click')).toMatchObject([{kind:'click',button:'left',count:2}])
|
|
|
+ await viewer.getByRole('button',{name:'交还并关闭',exact:true}).click()
|
|
|
+ await dock.getByRole('button',{name:'停止虚拟机',exact:true}).click()
|
|
|
+ await expect(dock.getByRole('button',{name:'启动虚拟机',exact:true})).toBeVisible()
|
|
|
+})
|
|
|
|
|
|
-test('always exposes computer management and performs image and sharing actions through the UI',async({page},testInfo)=>{
|
|
|
- await page.goto('/conversations');await page.getByRole('textbox',{name:'账号',exact:true}).fill('fixture');await page.getByRole('textbox',{name:'密码',exact:true}).fill('fixture-pass');await page.getByRole('button',{name:'登录',exact:true}).click()
|
|
|
- await expect(page.locator('.desktop-sidebar .environment-entry')).toBeVisible()
|
|
|
- await page.request.post('/__test/image-management',{data:{}})
|
|
|
- await page.locator('.desktop-sidebar .environment-entry button').click()
|
|
|
- const hub=page.getByRole('dialog',{name:'电脑与环境',exact:true})
|
|
|
- await expect(hub).toBeVisible();await expect(hub.getByText('尚未配置电脑',{exact:true}).first()).toBeVisible()
|
|
|
- await hub.getByRole('button',{name:'镜像',exact:true}).click()
|
|
|
- await expect(hub.getByRole('button',{name:'准备兼容镜像'})).toBeVisible()
|
|
|
- await expect(hub.getByRole('region',{name:'桌面镜像状态'})).toContainText('桌面镜像已应用')
|
|
|
- await page.screenshot({path:testInfo.outputPath('image-desktop-overview.png')})
|
|
|
- const rows=hub.locator('.image-card');await expect(rows.first()).toContainText('当前使用')
|
|
|
- await rows.nth(1).getByRole('button',{name:'应用',exact:true}).click()
|
|
|
- await expect(rows.nth(1)).toContainText('当前使用')
|
|
|
- await hub.getByRole('button',{name:'回退到上一镜像'}).click();await expect(rows.first()).toContainText('当前使用')
|
|
|
- await rows.first().getByRole('button',{name:'导出',exact:true}).click()
|
|
|
- await expect(hub.getByRole('link',{name:'下载镜像',exact:true})).toBeVisible()
|
|
|
- const download=page.waitForEvent('download');await hub.getByRole('link',{name:'下载镜像',exact:true}).click();expect((await download).suggestedFilename()).toBe('computer-image.tar')
|
|
|
- await page.setViewportSize({width:375,height:844});await page.emulateMedia({colorScheme:'dark',reducedMotion:'reduce'});await hub.getByRole('button',{name:'准备兼容镜像'}).scrollIntoViewIfNeeded();await page.screenshot({path:testInfo.outputPath('environment-images-mobile.png')})
|
|
|
- await hub.getByRole('button',{name:'共享环境',exact:true}).click();await expect(hub.getByText('创建共享环境',{exact:true}).first()).toBeVisible()
|
|
|
- await hub.getByRole('button',{name:'关闭',exact:true}).click()
|
|
|
- await page.route('**/api/app/computers',route=>route.fulfill({status:404,contentType:'application/json',body:'{"error":"old server"}'}))
|
|
|
- await page.setViewportSize({width:1280,height:900});await page.locator('.desktop-sidebar .environment-entry button').click()
|
|
|
- await expect(page.getByRole('dialog',{name:'电脑与环境'})).toContainText('当前连接的服务尚未提供电脑管理')
|
|
|
- await page.screenshot({path:testInfo.outputPath('environment-old-server.png')})
|
|
|
+test('two desktops are watch-only on opening and release before changing the controlled pane',async({page},testInfo)=>{
|
|
|
+ await login(page,true)
|
|
|
+ const first=await(await page.request.post('/__test/computer',{data:{}})).json()
|
|
|
+ const second=await(await page.request.post('/__test/computer',{data:{}})).json()
|
|
|
+ await page.goto(`/conversations/${first.conversationId}`)
|
|
|
+ await page.getByRole('button',{name:'电脑',exact:true}).click()
|
|
|
+ const dock=page.getByRole('complementary',{name:'Agent 电脑面板'})
|
|
|
+ await expect(dock.getByRole('button',{name:'打开双桌面'})).toBeVisible()
|
|
|
+ await dock.getByRole('button',{name:'打开双桌面'}).click()
|
|
|
+ const workspace=page.getByRole('main',{name:'双桌面工作区'})
|
|
|
+ await expect(workspace.locator('.pane')).toHaveCount(2)
|
|
|
+ await workspace.getByRole('combobox',{name:'选择桌面 2'}).selectOption(second.agentId)
|
|
|
+ await expect(workspace.locator('.pane').last().getByRole('img')).toBeVisible()
|
|
|
+ await expect(workspace.getByRole('button',{name:'接管电脑',exact:true})).toHaveCount(2)
|
|
|
+ await workspace.locator('.pane').first().getByRole('button',{name:'接管电脑',exact:true}).click()
|
|
|
+ await expect(workspace.locator('.pane').first()).toContainText('人工控制中')
|
|
|
+ await workspace.locator('.pane').last().getByRole('button',{name:'接管电脑',exact:true}).click()
|
|
|
+ await expect(workspace.locator('.pane').first().getByRole('button',{name:'接管电脑',exact:true})).toBeVisible()
|
|
|
+ await expect(workspace.locator('.pane').last()).toContainText('人工控制中')
|
|
|
+ await page.screenshot({path:testInfo.outputPath('local-vm-two-desktops.png')})
|
|
|
+ await workspace.getByRole('button',{name:'交还并关闭',exact:true}).click()
|
|
|
+ await expect(workspace).toHaveCount(0)
|
|
|
})
|