Merge pull request #1948 from lightpanda-io/cdp-waitforselector
Some checks failed
e2e-test / zig build release (push) Has been cancelled
e2e-test / demo-scripts (push) Has been cancelled
e2e-test / wba-demo-scripts (push) Has been cancelled
e2e-test / wba-test (push) Has been cancelled
e2e-test / cdp-and-hyperfine-bench (push) Has been cancelled
e2e-test / perf-fmt (push) Has been cancelled
e2e-test / browser fetch (push) Has been cancelled
zig-test / zig fmt (push) Has been cancelled
zig-test / zig test using v8 in debug mode (push) Has been cancelled
zig-test / zig test (push) Has been cancelled
zig-test / perf-fmt (push) Has been cancelled

CDP: add waitForSelector to lp.actions
This commit is contained in:
Karl Seguin
2026-03-23 10:09:09 +08:00
committed by GitHub
3 changed files with 100 additions and 17 deletions

View File

@@ -581,28 +581,21 @@ fn handleWaitForSelector(server: *Server, arena: std.mem.Allocator, id: std.json
};
const timeout_ms = args.timeout orelse 5000;
var timer = try std.time.Timer.start();
while (true) {
const element = Selector.querySelector(page.document.asNode(), args.selector, page) catch {
const node = lp.actions.waitForSelector(args.selector, timeout_ms, page) catch |err| {
if (err == error.InvalidSelector) {
return server.sendError(id, .InvalidParams, "Invalid selector");
};
if (element) |el| {
const registered = try server.node_registry.register(el.asNode());
const msg = std.fmt.allocPrint(arena, "Element found. backendNodeId: {d}", .{registered.id}) catch "Element found.";
const content = [_]protocol.TextContent([]const u8){.{ .text = msg }};
return server.sendResult(id, protocol.CallToolResult([]const u8){ .content = &content });
}
const elapsed: u32 = @intCast(timer.read() / std.time.ns_per_ms);
if (elapsed >= timeout_ms) {
} else if (err == error.Timeout) {
return server.sendError(id, .InternalError, "Timeout waiting for selector");
}
return server.sendError(id, .InternalError, "Failed waiting for selector");
};
_ = server.session.wait(.{ .timeout_ms = @min(100, timeout_ms - elapsed) });
}
const registered = try server.node_registry.register(node);
const msg = std.fmt.allocPrint(arena, "Element found. backendNodeId: {d}", .{registered.id}) catch "Element found.";
const content = [_]protocol.TextContent([]const u8){.{ .text = msg }};
return server.sendResult(id, protocol.CallToolResult([]const u8){ .content = &content });
}
fn parseArguments(comptime T: type, arena: std.mem.Allocator, arguments: ?std.json.Value, server: *Server, id: std.json.Value, tool_name: []const u8) !T {