如果您运行以下代码,那么在循环的每次迭代中,浏览器都会出现在最前面并获得焦点。
public class Program
{
private static void Main()
{
var driver = new ChromeDriver();
driver.Navigate().GoToUrl("https://i.imgur.com/cdA7SBB.jpg");
for (int i = 0; i < 100; i++)
{
var ss = ((ITakesScreenshot)driver).GetScreenshot();
ss.SaveAsFile("D:/imgs/i.jpg");
}
}
}
问题是:为什么会出现这种情况,是否可以关闭? headless mod 不适合。
这似乎总是在 Selenium 需要保存/读取文件或启动进程时发生。
最佳答案
要截取屏幕截图,chromedriver 会激活窗口。这是设计使然,即使在技术上可行,也无法避免。 有关相关资源,请查看 window_commands.cc .
然而,您可以通过将窗口移到屏幕外来避免这种效果:
driver.Manage().Window.Position = new Point(-32000, -32000);
或通过在屏幕外启动浏览器:
var options = new ChromeOptions();
options.AddArgument("--window-position=-32000,-32000");
更新
您可以通过 devtool API 直接截屏来避免激活。这是一个重写 GetScreenshot
的类:
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Remote;
using JObject = System.Collections.Generic.Dictionary<string, object>;
class ChromeDriverEx : ChromeDriver
{
public ChromeDriverEx(ChromeOptions options = null)
: base(options ?? new ChromeOptions()) {
var repo = base.CommandExecutor.CommandInfoRepository;
repo.TryAddCommand("send", new CommandInfo("POST", "/session/{sessionId}/chromium/send_command_and_get_result"));
}
public new Screenshot GetScreenshot() {
object response = Send("Page.captureScreenshot", new JObject {{"format", "png"}, {"fromSurface", true}});
string base64 = (string)((JObject)response)["data"];
return new Screenshot(base64);
}
protected object Send(string cmd, JObject args) {
return this.Execute("send", new JObject {{"cmd", cmd}, {"params", args}}).Value;
}
}
用法:
var driver = new ChromeDriverEx();
driver.Url = "https://stackoverflow.com";
driver.GetScreenshot().SaveAsFile("/tmp/screenshot.png");
driver.Quit();
关于c# - Selenium 。前面的调出窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48243989/