c# - Selenium 。前面的调出窗口

标签 c# selenium selenium-webdriver

如果您运行以下代码,那么在循环的每次迭代中,浏览器都会出现在最前面并获得焦点。

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/

相关文章:

C# float max 解析错误

c# - 如何检索点击的 ListView 行数据和隐藏 id 列

c# - CRM 以编程方式创建字段

java - 选择 Selenium 中的第 N 个类型

java - 动态生成Testng.xlm来运行测试

c# - WPF 在 for 循环中递增绑定(bind)属性不会通知 UI,并会阻止它

python - (Python, Selenium )隐式和显式等待不起作用

eclipse - 如何在每次运行 htmlUnit 或 Selenium 测试之前始终设置正确数量的标签? eclipse

python-3.x - Selenium “Unable to find a matching set of capabilities” 尽管驱动程序位于/usr/local/bin

node.js - 带有 geckodriver 的 Firefox 无法在 Ubuntu 服务器上启动