Skip to content

Commit 862130e

Browse files
committed
refactor: update waitForTextOnPage to accept a non-empty array of strings
1 parent 8d6f66d commit 862130e

5 files changed

Lines changed: 18 additions & 28 deletions

File tree

docs/tool-reference.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@
193193

194194
**Parameters:**
195195

196-
- **text** (string | array of string) **(required)**: Text to appear on the page, or a non-empty list of texts. Resolves when any value appears.
196+
- **text** (array of string) **(required)**: Non-empty list of texts. Resolves when any value appears on the page.
197197
- **timeout** (integer) _(optional)_: Maximum wait time in milliseconds. If set to 0, the default timeout will be used.
198198

199199
---

src/McpContext.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -826,20 +826,15 @@ export class McpContext implements Context {
826826
}
827827

828828
waitForTextOnPage(
829-
text: string | string[],
829+
text: [string, ...string[]],
830830
timeout?: number,
831831
): Promise<Element> {
832832
const page = this.getSelectedPage();
833833
const frames = page.frames();
834-
const texts = Array.isArray(text) ? text : [text];
835-
836-
if (texts.length === 0) {
837-
throw new Error('At least one text value is required.');
838-
}
839834

840835
let locator = this.#locatorClass.race(
841836
frames.flatMap(frame =>
842-
texts.flatMap(value => [
837+
text.flatMap(value => [
843838
frame.locator(`aria/${value}`),
844839
frame.locator(`text/${value}`),
845840
]),

src/tools/ToolDefinition.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ export type Context = Readonly<{
144144
options?: {timeout?: number},
145145
): Promise<void>;
146146
waitForTextOnPage(
147-
text: string | string[],
147+
text: [string, ...string[]],
148148
timeout?: number,
149149
): Promise<Element>;
150150
getDevToolsData(): Promise<DevToolsData>;

src/tools/snapshot.ts

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,10 @@ export const waitFor = defineTool({
5050
},
5151
schema: {
5252
text: zod
53-
.union([zod.string(), zod.array(zod.string()).nonempty()])
53+
.tuple([zod.string()])
54+
.rest(zod.string())
5455
.describe(
55-
'Text to appear on the page, or a non-empty list of texts. Resolves when any value appears.',
56+
'Non-empty list of texts. Resolves when any value appears on the page.',
5657
),
5758
...timeoutSchema,
5859
},
@@ -62,15 +63,9 @@ export const waitFor = defineTool({
6263
request.params.timeout,
6364
);
6465

65-
if (Array.isArray(request.params.text)) {
66-
response.appendResponseLine(
67-
`Element matching one of ${JSON.stringify(request.params.text)} found.`,
68-
);
69-
} else {
70-
response.appendResponseLine(
71-
`Element with text "${request.params.text}" found.`,
72-
);
73-
}
66+
response.appendResponseLine(
67+
`Element matching one of ${JSON.stringify(request.params.text)} found.`,
68+
);
7469

7570
response.includeSnapshot();
7671
},

tests/tools/snapshot.test.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ describe('snapshot', () => {
3030
await waitFor.handler(
3131
{
3232
params: {
33-
text: 'Hello',
33+
text: ['Hello'],
3434
},
3535
},
3636
response,
@@ -39,7 +39,7 @@ describe('snapshot', () => {
3939

4040
assert.equal(
4141
response.responseLines[0],
42-
'Element with text "Hello" found.',
42+
'Element matching one of ["Hello"] found.',
4343
);
4444
assert.ok(response.includeSnapshot);
4545
});
@@ -107,7 +107,7 @@ describe('snapshot', () => {
107107
const handlePromise = waitFor.handler(
108108
{
109109
params: {
110-
text: 'Hello World',
110+
text: ['Hello World'],
111111
},
112112
},
113113
response,
@@ -122,7 +122,7 @@ describe('snapshot', () => {
122122

123123
assert.equal(
124124
response.responseLines[0],
125-
'Element with text "Hello World" found.',
125+
'Element matching one of ["Hello World"] found.',
126126
);
127127
assert.ok(response.includeSnapshot);
128128
});
@@ -138,7 +138,7 @@ describe('snapshot', () => {
138138
await waitFor.handler(
139139
{
140140
params: {
141-
text: 'Header',
141+
text: ['Header'],
142142
},
143143
},
144144
response,
@@ -147,7 +147,7 @@ describe('snapshot', () => {
147147

148148
assert.equal(
149149
response.responseLines[0],
150-
'Element with text "Header" found.',
150+
'Element matching one of ["Header"] found.',
151151
);
152152
assert.ok(response.includeSnapshot);
153153
});
@@ -165,7 +165,7 @@ describe('snapshot', () => {
165165
await waitFor.handler(
166166
{
167167
params: {
168-
text: 'Hello iframe',
168+
text: ['Hello iframe'],
169169
},
170170
},
171171
response,
@@ -174,7 +174,7 @@ describe('snapshot', () => {
174174

175175
assert.equal(
176176
response.responseLines[0],
177-
'Element with text "Hello iframe" found.',
177+
'Element matching one of ["Hello iframe"] found.',
178178
);
179179
assert.ok(response.includeSnapshot);
180180
});

0 commit comments

Comments
 (0)