mirror of
https://github.com/lightpanda-io/browser.git
synced 2026-03-21 20:24:42 +00:00
test: add waitForSelector MCP tool tests
Add three test cases covering: - Immediate match on an already-present element - Polling match on an element added after a 200ms setTimeout delay - Timeout error on a non-existent element with a short timeout Add mcp_wait_for_selector.html test fixture that injects a #delayed element after 200ms via setTimeout for the polling test. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
14
src/browser/tests/mcp_wait_for_selector.html
Normal file
14
src/browser/tests/mcp_wait_for_selector.html
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
<div id="existing">Already here</div>
|
||||||
|
<script>
|
||||||
|
setTimeout(function() {
|
||||||
|
var el = document.createElement("div");
|
||||||
|
el.id = "delayed";
|
||||||
|
el.textContent = "Appeared after delay";
|
||||||
|
document.body.appendChild(el);
|
||||||
|
}, 200);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -723,3 +723,104 @@ test "MCP - Actions: click, fill, scroll" {
|
|||||||
|
|
||||||
try testing.expect(result.isTrue());
|
try testing.expect(result.isTrue());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test "MCP - waitForSelector: existing element" {
|
||||||
|
defer testing.reset();
|
||||||
|
const allocator = testing.allocator;
|
||||||
|
const app = testing.test_app;
|
||||||
|
|
||||||
|
var out_alloc: std.io.Writer.Allocating = .init(testing.arena_allocator);
|
||||||
|
defer out_alloc.deinit();
|
||||||
|
|
||||||
|
var server = try Server.init(allocator, app, &out_alloc.writer);
|
||||||
|
defer server.deinit();
|
||||||
|
|
||||||
|
const aa = testing.arena_allocator;
|
||||||
|
const page = try server.session.createPage();
|
||||||
|
const url = "http://localhost:9582/src/browser/tests/mcp_wait_for_selector.html";
|
||||||
|
try page.navigate(url, .{ .reason = .address_bar, .kind = .{ .push = null } });
|
||||||
|
_ = server.session.wait(.{});
|
||||||
|
|
||||||
|
// waitForSelector on an element that already exists returns immediately
|
||||||
|
const msg =
|
||||||
|
\\{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"waitForSelector","arguments":{"selector":"#existing","timeout":2000}}}
|
||||||
|
;
|
||||||
|
try router.handleMessage(server, aa, msg);
|
||||||
|
|
||||||
|
try testing.expectJson(
|
||||||
|
\\{
|
||||||
|
\\ "id": 1,
|
||||||
|
\\ "result": {
|
||||||
|
\\ "content": [
|
||||||
|
\\ { "type": "text" }
|
||||||
|
\\ ]
|
||||||
|
\\ }
|
||||||
|
\\}
|
||||||
|
, out_alloc.writer.buffered());
|
||||||
|
}
|
||||||
|
|
||||||
|
test "MCP - waitForSelector: delayed element" {
|
||||||
|
defer testing.reset();
|
||||||
|
const allocator = testing.allocator;
|
||||||
|
const app = testing.test_app;
|
||||||
|
|
||||||
|
var out_alloc: std.io.Writer.Allocating = .init(testing.arena_allocator);
|
||||||
|
defer out_alloc.deinit();
|
||||||
|
|
||||||
|
var server = try Server.init(allocator, app, &out_alloc.writer);
|
||||||
|
defer server.deinit();
|
||||||
|
|
||||||
|
const aa = testing.arena_allocator;
|
||||||
|
const page = try server.session.createPage();
|
||||||
|
const url = "http://localhost:9582/src/browser/tests/mcp_wait_for_selector.html";
|
||||||
|
try page.navigate(url, .{ .reason = .address_bar, .kind = .{ .push = null } });
|
||||||
|
_ = server.session.wait(.{});
|
||||||
|
|
||||||
|
// waitForSelector on an element added after 200ms via setTimeout
|
||||||
|
const msg =
|
||||||
|
\\{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"waitForSelector","arguments":{"selector":"#delayed","timeout":5000}}}
|
||||||
|
;
|
||||||
|
try router.handleMessage(server, aa, msg);
|
||||||
|
|
||||||
|
try testing.expectJson(
|
||||||
|
\\{
|
||||||
|
\\ "id": 1,
|
||||||
|
\\ "result": {
|
||||||
|
\\ "content": [
|
||||||
|
\\ { "type": "text" }
|
||||||
|
\\ ]
|
||||||
|
\\ }
|
||||||
|
\\}
|
||||||
|
, out_alloc.writer.buffered());
|
||||||
|
}
|
||||||
|
|
||||||
|
test "MCP - waitForSelector: timeout" {
|
||||||
|
defer testing.reset();
|
||||||
|
const allocator = testing.allocator;
|
||||||
|
const app = testing.test_app;
|
||||||
|
|
||||||
|
var out_alloc: std.io.Writer.Allocating = .init(testing.arena_allocator);
|
||||||
|
defer out_alloc.deinit();
|
||||||
|
|
||||||
|
var server = try Server.init(allocator, app, &out_alloc.writer);
|
||||||
|
defer server.deinit();
|
||||||
|
|
||||||
|
const aa = testing.arena_allocator;
|
||||||
|
const page = try server.session.createPage();
|
||||||
|
const url = "http://localhost:9582/src/browser/tests/mcp_wait_for_selector.html";
|
||||||
|
try page.navigate(url, .{ .reason = .address_bar, .kind = .{ .push = null } });
|
||||||
|
_ = server.session.wait(.{});
|
||||||
|
|
||||||
|
// waitForSelector with a short timeout on a non-existent element should error
|
||||||
|
const msg =
|
||||||
|
\\{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"waitForSelector","arguments":{"selector":"#nonexistent","timeout":100}}}
|
||||||
|
;
|
||||||
|
try router.handleMessage(server, aa, msg);
|
||||||
|
|
||||||
|
try testing.expectJson(
|
||||||
|
\\{
|
||||||
|
\\ "id": 1,
|
||||||
|
\\ "error": {}
|
||||||
|
\\}
|
||||||
|
, out_alloc.writer.buffered());
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user