我能够通过多步骤解决方案克服这个问题。这适用于 Edge/Chrome 103+ 和 Selenium 4.1+
首先,我通过使用 WebDriver 的直接命令覆盖 GetScreenshot() 方法摆脱了主动焦点调用。
public Screenshot GetScreenshot()
{
IHasCommandExecutor executor = Driver as IHasCommandExecutor;
var sessionId = ((WebDriver)Driver).SessionId;
var command = new HttpCommandInfo(HttpCommandInfo.PostCommand, $"/session/{sessionId}/chromium/send_command_and_get_result");
executor.CommandExecutor.TryAddCommand("Send", command);
var response = Send(executor, "Page.captureScreenshot", new JObject { { "format", "png" }, { "fromSurface", true } });
var base64 = ((Dictionary<string, object>)response.Value)["data"];
return new Screenshot(base64.ToString());
}
private Response Send(IHasCommandExecutor executor, string cmd, JObject args)
{
var json = new JObject { { "cmd", cmd }, { "params", args } };
var command = new Command("Send", json.ToString());
return executor.CommandExecutor.Execute(command);
}
第二,我找到了 Chromium 浏览器的扩展,它禁用了 Visibility API。它们有很多,只需在 Chrome Web Store 中搜索“禁用可见性 API”即可。显然,它伪造了浏览器窗口的“活跃性”,因此onfocusout 和blur 将不再触发。现在,您只需在实例化驱动程序时包含扩展名:
var options = new EdgeOptions();
options.AddExtension("your path to extension");
new DriverManager().SetUpDriver(new EdgeConfig(), VersionResolveStrategy.MatchingBrowser);
var service = EdgeDriverService.CreateDefaultService();
Driver = new EdgeDriver(edgeOptions);