Skip to content

Commit 4c8d881

Browse files
quanruyuyutaotao
andauthored
fix(web-integration): handle undefined aiInput case in ScriptPlayer (#743)
* fix(web-integration): handle undefined aiInput case in ScriptPlayer * fix(workflow): version * fix(core): yaml player --------- Co-authored-by: yutao <yutao.tao@bytedance.com>
1 parent 1589d10 commit 4c8d881

File tree

3 files changed

+58
-20
lines changed

3 files changed

+58
-20
lines changed

packages/web-integration/src/yaml/player.ts

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,8 @@ export class ScriptPlayer<T extends MidsceneYamlScriptEnv> {
130130
taskStatus.currentStep = currentStep;
131131
const flowItem = flow[flowItemIndex];
132132
if (
133-
(flowItem as MidsceneYamlFlowItemAIAction).aiAction ||
134-
(flowItem as MidsceneYamlFlowItemAIAction).ai
133+
'aiAction' in (flowItem as MidsceneYamlFlowItemAIAction) ||
134+
'ai' in (flowItem as MidsceneYamlFlowItemAIAction)
135135
) {
136136
const actionTask = flowItem as MidsceneYamlFlowItemAIAction;
137137
const prompt = actionTask.aiAction || actionTask.ai;
@@ -141,7 +141,7 @@ export class ScriptPlayer<T extends MidsceneYamlScriptEnv> {
141141
'prompt for aiAction must be a string',
142142
);
143143
await agent.aiAction(prompt);
144-
} else if ((flowItem as MidsceneYamlFlowItemAIAssert).aiAssert) {
144+
} else if ('aiAssert' in (flowItem as MidsceneYamlFlowItemAIAssert)) {
145145
const assertTask = flowItem as MidsceneYamlFlowItemAIAssert;
146146
const prompt = assertTask.aiAssert;
147147
assert(prompt, 'missing prompt for aiAssert');
@@ -150,7 +150,7 @@ export class ScriptPlayer<T extends MidsceneYamlScriptEnv> {
150150
'prompt for aiAssert must be a string',
151151
);
152152
await agent.aiAssert(prompt);
153-
} else if ((flowItem as MidsceneYamlFlowItemAIQuery).aiQuery) {
153+
} else if ('aiQuery' in (flowItem as MidsceneYamlFlowItemAIQuery)) {
154154
const queryTask = flowItem as MidsceneYamlFlowItemAIQuery;
155155
const prompt = queryTask.aiQuery;
156156
assert(prompt, 'missing prompt for aiQuery');
@@ -160,7 +160,7 @@ export class ScriptPlayer<T extends MidsceneYamlScriptEnv> {
160160
);
161161
const queryResult = await agent.aiQuery(prompt);
162162
this.setResult(queryTask.name, queryResult);
163-
} else if ((flowItem as MidsceneYamlFlowItemAINumber).aiNumber) {
163+
} else if ('aiNumber' in (flowItem as MidsceneYamlFlowItemAINumber)) {
164164
const numberTask = flowItem as MidsceneYamlFlowItemAINumber;
165165
const prompt = numberTask.aiNumber;
166166
assert(prompt, 'missing prompt for number');
@@ -170,7 +170,7 @@ export class ScriptPlayer<T extends MidsceneYamlScriptEnv> {
170170
);
171171
const numberResult = await agent.aiNumber(prompt);
172172
this.setResult(numberTask.name, numberResult);
173-
} else if ((flowItem as MidsceneYamlFlowItemAINString).aiString) {
173+
} else if ('aiString' in (flowItem as MidsceneYamlFlowItemAINString)) {
174174
const stringTask = flowItem as MidsceneYamlFlowItemAINString;
175175
const prompt = stringTask.aiString;
176176
assert(prompt, 'missing prompt for string');
@@ -180,7 +180,7 @@ export class ScriptPlayer<T extends MidsceneYamlScriptEnv> {
180180
);
181181
const stringResult = await agent.aiString(prompt);
182182
this.setResult(stringTask.name, stringResult);
183-
} else if ((flowItem as MidsceneYamlFlowItemAIBoolean).aiBoolean) {
183+
} else if ('aiBoolean' in (flowItem as MidsceneYamlFlowItemAIBoolean)) {
184184
const booleanTask = flowItem as MidsceneYamlFlowItemAIBoolean;
185185
const prompt = booleanTask.aiBoolean;
186186
assert(prompt, 'missing prompt for boolean');
@@ -190,7 +190,7 @@ export class ScriptPlayer<T extends MidsceneYamlScriptEnv> {
190190
);
191191
const booleanResult = await agent.aiBoolean(prompt);
192192
this.setResult(booleanTask.name, booleanResult);
193-
} else if ((flowItem as MidsceneYamlFlowItemAILocate).aiLocate) {
193+
} else if ('aiLocate' in (flowItem as MidsceneYamlFlowItemAILocate)) {
194194
const locateTask = flowItem as MidsceneYamlFlowItemAILocate;
195195
const prompt = locateTask.aiLocate;
196196
assert(prompt, 'missing prompt for aiLocate');
@@ -200,7 +200,7 @@ export class ScriptPlayer<T extends MidsceneYamlScriptEnv> {
200200
);
201201
const locateResult = await agent.aiLocate(prompt);
202202
this.setResult(locateTask.name, locateResult);
203-
} else if ((flowItem as MidsceneYamlFlowItemAIWaitFor).aiWaitFor) {
203+
} else if ('aiWaitFor' in (flowItem as MidsceneYamlFlowItemAIWaitFor)) {
204204
const waitForTask = flowItem as MidsceneYamlFlowItemAIWaitFor;
205205
const prompt = waitForTask.aiWaitFor;
206206
assert(prompt, 'missing prompt for aiWaitFor');
@@ -210,7 +210,7 @@ export class ScriptPlayer<T extends MidsceneYamlScriptEnv> {
210210
);
211211
const timeout = waitForTask.timeout;
212212
await agent.aiWaitFor(prompt, { timeoutMs: timeout });
213-
} else if ((flowItem as MidsceneYamlFlowItemSleep).sleep) {
213+
} else if ('sleep' in (flowItem as MidsceneYamlFlowItemSleep)) {
214214
const sleepTask = flowItem as MidsceneYamlFlowItemSleep;
215215
const ms = sleepTask.sleep;
216216
let msNumber = ms;
@@ -222,17 +222,18 @@ export class ScriptPlayer<T extends MidsceneYamlScriptEnv> {
222222
`ms for sleep must be greater than 0, but got ${ms}`,
223223
);
224224
await new Promise((resolve) => setTimeout(resolve, msNumber));
225-
} else if ((flowItem as MidsceneYamlFlowItemAITap).aiTap) {
225+
} else if ('aiTap' in (flowItem as MidsceneYamlFlowItemAITap)) {
226226
const tapTask = flowItem as MidsceneYamlFlowItemAITap;
227227
await agent.aiTap(tapTask.aiTap, tapTask);
228-
} else if ((flowItem as MidsceneYamlFlowItemAIHover).aiHover) {
228+
} else if ('aiHover' in (flowItem as MidsceneYamlFlowItemAIHover)) {
229229
const hoverTask = flowItem as MidsceneYamlFlowItemAIHover;
230230
await agent.aiHover(hoverTask.aiHover, hoverTask);
231-
} else if ((flowItem as MidsceneYamlFlowItemAIInput).aiInput) {
231+
} else if ('aiInput' in (flowItem as MidsceneYamlFlowItemAIInput)) {
232+
// may be input empty string ''
232233
const inputTask = flowItem as MidsceneYamlFlowItemAIInput;
233234
await agent.aiInput(inputTask.aiInput, inputTask.locate, inputTask);
234235
} else if (
235-
(flowItem as MidsceneYamlFlowItemAIKeyboardPress).aiKeyboardPress
236+
'aiKeyboardPress' in (flowItem as MidsceneYamlFlowItemAIKeyboardPress)
236237
) {
237238
const keyboardPressTask =
238239
flowItem as MidsceneYamlFlowItemAIKeyboardPress;
@@ -241,15 +242,11 @@ export class ScriptPlayer<T extends MidsceneYamlScriptEnv> {
241242
keyboardPressTask.locate,
242243
keyboardPressTask,
243244
);
244-
} else if (
245-
typeof (flowItem as MidsceneYamlFlowItemAIScroll).aiScroll !==
246-
'undefined'
247-
) {
245+
} else if ('aiScroll' in (flowItem as MidsceneYamlFlowItemAIScroll)) {
248246
const scrollTask = flowItem as MidsceneYamlFlowItemAIScroll;
249247
await agent.aiScroll(scrollTask, scrollTask.locate, scrollTask);
250248
} else if (
251-
typeof (flowItem as MidsceneYamlFlowItemEvaluateJavaScript)
252-
.javascript !== 'undefined'
249+
'javascript' in (flowItem as MidsceneYamlFlowItemEvaluateJavaScript)
253250
) {
254251
const evaluateJavaScriptTask =
255252
flowItem as MidsceneYamlFlowItemEvaluateJavaScript;

packages/web-integration/tests/unit-test/yaml/__snapshots__/utils.test.ts.snap

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,27 @@ exports[`utils > build yaml 1`] = `
66
tasks: []
77
"
88
`;
9+
10+
exports[`utils > parseYamlScript > interpolates environment variables 1`] = `
11+
{
12+
"target": {
13+
"url": "sample_url",
14+
},
15+
"tasks": [
16+
{
17+
"sleep": 1000,
18+
},
19+
{
20+
"aiTap": "sample_button",
21+
},
22+
{
23+
"aiInput": "sample_input",
24+
"locate": "input description",
25+
},
26+
{
27+
"aiInput": null,
28+
"locate": "input description",
29+
},
30+
],
31+
}
32+
`;

packages/web-integration/tests/unit-test/yaml/utils.test.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,23 @@ describe('utils', () => {
88
});
99

1010
describe('parseYamlScript', () => {
11+
test('interpolates environment variables', () => {
12+
const yamlContent = `
13+
target:
14+
url: "sample_url"
15+
tasks:
16+
- sleep: 1000
17+
- aiTap: "sample_button"
18+
- aiInput: "sample_input"
19+
locate: input description
20+
- aiInput:
21+
locate: input description
22+
`;
23+
24+
const result = parseYamlScript(yamlContent);
25+
expect(result).toMatchSnapshot();
26+
});
27+
1128
test('interpolates environment variables', () => {
1229
process.env.TEST_URL = 'https://example.com';
1330
process.env.TEST_PATH = '/test/path';

0 commit comments

Comments
 (0)