125 lines
3.7 KiB
TypeScript
125 lines
3.7 KiB
TypeScript
/**
|
|
* Windsurf Workflow 测试
|
|
* 使用新的TypeScript架构测试旧的YAML workflow
|
|
*/
|
|
|
|
import * as fs from 'fs';
|
|
import * as path from 'path';
|
|
import * as yaml from 'js-yaml';
|
|
import { AdsPowerProvider } from '../src/providers/adspower/AdsPowerProvider';
|
|
import { WorkflowEngine } from '../src/workflow/WorkflowEngine';
|
|
|
|
interface WindsurfConfig {
|
|
site: string;
|
|
workflow: any[];
|
|
errorHandling?: any;
|
|
}
|
|
|
|
async function runWindsurfWorkflow() {
|
|
console.log('🚀 Starting Windsurf Workflow Test...\n');
|
|
|
|
// 1. 读取YAML配置
|
|
const configPath = path.join(__dirname, '../configs/sites/windsurf.yaml');
|
|
console.log(`📄 Loading config from: ${configPath}`);
|
|
|
|
if (!fs.existsSync(configPath)) {
|
|
console.error('❌ Config file not found!');
|
|
console.log('Please copy windsurf.yaml to: browser-automation-ts/configs/sites/windsurf.yaml');
|
|
process.exit(1);
|
|
}
|
|
|
|
const configContent = fs.readFileSync(configPath, 'utf8');
|
|
const config = yaml.load(configContent) as WindsurfConfig;
|
|
|
|
console.log(`✅ Loaded workflow with ${config.workflow.length} steps\n`);
|
|
|
|
// 2. 初始化AdsPower Provider
|
|
console.log('🌐 Initializing AdsPower Provider...');
|
|
const provider = new AdsPowerProvider({
|
|
profileId: process.env.ADSPOWER_USER_ID,
|
|
siteName: 'Windsurf'
|
|
});
|
|
|
|
try {
|
|
// 3. 启动浏览器
|
|
const result = await provider.launch();
|
|
console.log('✅ Browser launched successfully\n');
|
|
|
|
// 4. 准备Context
|
|
const context = {
|
|
page: result.page,
|
|
browser: result.browser,
|
|
logger: console,
|
|
data: {
|
|
// 可以从环境变量或其他地方加载账号数据
|
|
account: {
|
|
email: process.env.WINDSURF_EMAIL || 'test@example.com',
|
|
password: process.env.WINDSURF_PASSWORD || 'password123'
|
|
}
|
|
},
|
|
siteConfig: {
|
|
url: 'https://codeium.com',
|
|
name: 'Windsurf'
|
|
},
|
|
config: config,
|
|
siteName: 'Windsurf'
|
|
};
|
|
|
|
// 5. 创建WorkflowEngine
|
|
const engine = new WorkflowEngine(
|
|
config.workflow,
|
|
context,
|
|
provider.getActionFactory()
|
|
);
|
|
|
|
// 6. 执行Workflow
|
|
console.log('▶️ Starting workflow execution...\n');
|
|
const workflowResult = await engine.execute();
|
|
|
|
// 7. 输出结果
|
|
console.log('\n' + '='.repeat(60));
|
|
console.log('📊 Workflow Execution Summary');
|
|
console.log('='.repeat(60));
|
|
console.log(`Status: ${workflowResult.success ? '✅ SUCCESS' : '❌ FAILED'}`);
|
|
console.log(`Steps Completed: ${workflowResult.steps}/${config.workflow.length}`);
|
|
console.log(`Duration: ${(workflowResult.duration / 1000).toFixed(2)}s`);
|
|
console.log(`Errors: ${workflowResult.errors.length}`);
|
|
|
|
if (workflowResult.errors.length > 0) {
|
|
console.log('\n❌ Errors:');
|
|
workflowResult.errors.forEach((err: any, i: number) => {
|
|
console.log(` ${i + 1}. Step ${err.step} (${err.name}): ${err.error}`);
|
|
});
|
|
}
|
|
console.log('='.repeat(60) + '\n');
|
|
|
|
// 8. 等待查看结果
|
|
console.log('⏸️ Waiting 5 seconds before closing...');
|
|
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
|
|
} catch (error: any) {
|
|
console.error('\n❌ Fatal error:', error.message);
|
|
console.error(error.stack);
|
|
} finally {
|
|
// 9. 关闭浏览器
|
|
try {
|
|
console.log('\n🔒 Closing browser...');
|
|
await provider.close();
|
|
console.log('✅ Browser closed successfully');
|
|
} catch (e: any) {
|
|
console.error('⚠️ Error closing browser:', e.message);
|
|
}
|
|
}
|
|
}
|
|
|
|
// 运行测试
|
|
runWindsurfWorkflow()
|
|
.then(() => {
|
|
console.log('\n✅ Test completed!');
|
|
process.exit(0);
|
|
})
|
|
.catch((error) => {
|
|
console.error('\n❌ Test failed:', error);
|
|
process.exit(1);
|
|
});
|