2025-02-21 16:15:51 +08:00
|
|
|
import { platform } from 'node:os';
|
2025-02-10 20:00:14 +08:00
|
|
|
import { PuppeteerAgent } from '@/puppeteer';
|
|
|
|
import { sleep } from '@midscene/core/utils';
|
|
|
|
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
|
|
import { launchPage } from './utils';
|
|
|
|
|
|
|
|
vi.setConfig({
|
|
|
|
testTimeout: 120 * 1000,
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('puppeteer integration', () => {
|
|
|
|
let resetFn: () => Promise<void>;
|
|
|
|
afterEach(async () => {
|
|
|
|
if (resetFn) {
|
|
|
|
await resetFn();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2025-02-13 15:53:53 +08:00
|
|
|
it('input and clear text', async () => {
|
|
|
|
const { originPage, reset } = await launchPage('https://www.google.com/');
|
|
|
|
resetFn = reset;
|
|
|
|
const agent = new PuppeteerAgent(originPage);
|
2025-02-21 16:15:51 +08:00
|
|
|
await agent.aiAction(
|
|
|
|
'Enter "happy birthday" , sleep 100ms, delete all text in the input box',
|
|
|
|
);
|
2025-02-13 15:53:53 +08:00
|
|
|
});
|
|
|
|
|
2025-02-21 16:15:51 +08:00
|
|
|
it('agent with yaml script', async () => {
|
2025-02-10 20:00:14 +08:00
|
|
|
const { originPage, reset } = await launchPage('https://www.bing.com/');
|
|
|
|
resetFn = reset;
|
|
|
|
const agent = new PuppeteerAgent(originPage);
|
|
|
|
await sleep(3000);
|
|
|
|
const { result } = await agent.runYaml(
|
|
|
|
`
|
2025-02-13 15:53:53 +08:00
|
|
|
tasks:
|
|
|
|
- name: search weather
|
|
|
|
flow:
|
2025-02-21 16:15:51 +08:00
|
|
|
- ai: input 'weather today' in input box, press Enter
|
2025-02-13 15:53:53 +08:00
|
|
|
- sleep: 3000
|
2025-02-10 20:00:14 +08:00
|
|
|
|
2025-02-21 16:15:51 +08:00
|
|
|
- name: result page
|
2025-02-13 15:53:53 +08:00
|
|
|
flow:
|
2025-02-21 16:15:51 +08:00
|
|
|
- aiQuery: "this is a search result page about weather. Return in this format: {answer: boolean}"
|
2025-02-13 15:53:53 +08:00
|
|
|
name: weather
|
|
|
|
`,
|
2025-02-10 20:00:14 +08:00
|
|
|
);
|
|
|
|
|
2025-02-21 16:15:51 +08:00
|
|
|
expect(result.weather.answer).toBeDefined();
|
2025-02-10 20:00:14 +08:00
|
|
|
});
|
|
|
|
|
|
|
|
it('assertion failed', async () => {
|
|
|
|
const { originPage, reset } = await launchPage('https://www.bing.com/');
|
|
|
|
resetFn = reset;
|
|
|
|
const agent = new PuppeteerAgent(originPage);
|
|
|
|
let errorMsg = '';
|
|
|
|
try {
|
|
|
|
await agent.runYaml(
|
|
|
|
`
|
2025-02-13 15:53:53 +08:00
|
|
|
tasks:
|
|
|
|
- name: search weather
|
|
|
|
flow:
|
|
|
|
- aiAssert: the result shows food delivery service
|
|
|
|
`,
|
2025-02-10 20:00:14 +08:00
|
|
|
);
|
|
|
|
} catch (e: any) {
|
|
|
|
errorMsg = e.message;
|
|
|
|
}
|
|
|
|
|
|
|
|
const multiLineErrorMsg = errorMsg.split('\n');
|
|
|
|
expect(multiLineErrorMsg.length).toBeGreaterThan(2);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('allow error in flow', async () => {
|
2025-02-21 16:15:51 +08:00
|
|
|
const { originPage, reset } = await launchPage(
|
|
|
|
platform() === 'darwin'
|
|
|
|
? 'https://www.baidu.com'
|
|
|
|
: 'https://www.bing.com/',
|
|
|
|
);
|
2025-02-10 20:00:14 +08:00
|
|
|
resetFn = reset;
|
|
|
|
const agent = new PuppeteerAgent(originPage);
|
|
|
|
const { result } = await agent.runYaml(
|
|
|
|
`
|
2025-02-13 15:53:53 +08:00
|
|
|
tasks:
|
|
|
|
- name: search weather
|
|
|
|
flow:
|
|
|
|
- ai: input 'weather today' in input box, click search button
|
|
|
|
- sleep: 3000
|
2025-02-10 20:00:14 +08:00
|
|
|
|
2025-02-13 15:53:53 +08:00
|
|
|
- name: error
|
|
|
|
continueOnError: true
|
|
|
|
flow:
|
|
|
|
- aiAssert: the result shows food delivery service
|
2025-02-21 16:15:51 +08:00
|
|
|
|
|
|
|
- name: result page
|
|
|
|
continueOnError: true
|
|
|
|
flow:
|
|
|
|
- aiQuery: "this is a search result, use this format to answer: {result: boolean}"
|
|
|
|
name: pageLoaded
|
2025-02-13 15:53:53 +08:00
|
|
|
`,
|
2025-02-10 20:00:14 +08:00
|
|
|
);
|
|
|
|
|
2025-02-21 16:15:51 +08:00
|
|
|
expect(result.pageLoaded).toBeDefined();
|
2025-02-10 20:00:14 +08:00
|
|
|
});
|
|
|
|
});
|