C# Selenium ChromeDriver:以管理员身份运行时 Google Chrome 失败

Ale*_*xei 4 selenium google-chrome selenium-chromedriver selenium-webdriver

我在 Chrome 中使用 Selenium Web Driver C# 时遇到了一个常见情况:如果运行测试的进程是“以管理员身份运行”(Visual Studio 或 nunit3-console.exe)Chrome 将无法加载。

语境

  • 操作系统:Windows 7 x64
  • Chrome:版本 64.0.3282.167(官方版本)(64 位)
  • Selenium.Chrome.WebDriver (chromedriver.exe): 2.35.0
  • 本地政策不允许 chrome 扩展

脚步

  1. 启动一个也会初始化驱动程序的测试

    var options = new ChromeOptions();
    
    //TODO: check if really needed
    options.AddAdditionalCapability("useAutomationExtension", false);
    options.AddArguments("--allow-no-sandbox-job");
    options.AddArguments("--ignore-certificate-errors");
    
    var driver = new ChromeDriver(options);
    
    Run Code Online (Sandbox Code Playgroud)
  2. ChromeDriver 启动成功:

    Starting ChromeDriver 2.35.528161 (5b82f2d2aae0ca24b877009200ced9065a772e73) on
    port 61771
    Only local connections are allowed.
    
    DevTools listening on ws://127.0.0.1:12890/devtools/browser/e50864bd-9c30-445c-a3f8-e33d6b6e5b49
    
    Run Code Online (Sandbox Code Playgroud)
  3. Chrome 已打开,但该选项卡无法加载

chrome 失败选项卡

  1. 如果我在附加时刷新选项卡,我会收到以下异常信息:

WebDriver.dll 中发生了“System.InvalidOperationException”类型的异常,但未在用户代码中处理

附加信息:会话未创建异常

从选项卡崩溃

(会话信息:chrome=64.0.3282.167)

(驱动信息: chromedriver=2.35.528161 (5b82f2d2aae0ca24b877009200ced9065a772e73),platform=Windows NT 6.1.7601 SP1 x86_64) (InsecureCertificate)

我不明白为什么它失败了。我觉得这可能与这个问题有关,但该问题涉及另一个用户,而不是处于提升模式的同一用户。

问题:为什么 C# Selenium ChromeDriver + Chrome 以管理员身份运行时失败。我该如何调查造成这种情况的根本原因?


我按照评论中的建议创建了一个小的控制台应用程序:

static void Main(string[] args)
{
    var options = new ChromeOptions();
    // this is required since otherwise it will try to load some extension which is not allowed by local policy
    options.AddAdditionalCapability("useAutomationExtension", false);
    // try to catch some errors, but does not seem to work
    options.AddArguments("--enable-logging");
    options.AddArguments("--v=1");
    var driver = new ChromeDriver(options);
    driver.Navigate().GoToUrl("http://localhost");
}
Run Code Online (Sandbox Code Playgroud)

在公司外的另一台计算机上进行了一些测试,无论 Chrome 驱动程序如何,它都能正常工作(尝试了 2.35 和 2.36)。其他不同之处在于操作系统(工作中的 Windows 7 和家庭中的 Windows 10)和工作中的本地策略(这可能会影响 Chrome 设置)。


感谢Tarun Lalwani我将问题简化为似乎与以管理员身份运行 + 本地策略 + 可能的 Chrome 问题有关的问题:

  1. 以详细模式运行 Web 驱动程序表明 Chrome 在正常运行与以管理员身份运行时使用完全不同的配置文件路径:

    • 正常运行:(dir="C:\Users\<my-dos-profile-name>\AppData\Local\Temp\scoped_dir21000_25907"每次运行更改)
    • 以管理员身份运行: dir="C:\WINDOWS\TEMP\scoped_dir7236_26307"
  2. 检查chrome.debugChrome 安装文件夹中的文件(每个临时配置文件中还创建了一个调试文件)我看到以下错误:

[0303/120050.213:ERROR:process_reader_win.cc(151)] SuspendThread:访问被拒绝。(0x5)
[0303/120050.214:ERROR:process_reader_win.cc(123)] NtOpenThread: {Access Denied} 一个进程请求访问一个对象,但没有被授予这些访问权限。(0xc0000022)
[0303/120050.215:ERROR:exception_snapshot_win.cc(88)] 线程 ID 13672 在进程中未找到
[0303/120050.215:WARNING:crash_report_exception_handler.ccize(62)] 失败

  1. 如果我只是以管理员身份运行 Chrome,所有还原选项卡都会崩溃,并且我会在日志中获得类似的错误。控制台(cmd)输出说:

C:\Program Files (x86)\Google\Chrome\Application>[7244:16744:0303/125934.383:ERROR:gpu_process_transport_factory.cc(1009)] 丢失 UI 共享上下文。
[7244:13716:0303/125956.057:ERROR:connection_factory_impl.cc(381)] 无法连接到 MCS 端点,错误为 -118

所以,至少现在我知道它与 Chrome 以管理员身份启动有关,而与 Chrome 驱动程序无关。

Ale*_*xei 5

我设法使用--no-sandbox选项绕过了这个问题。虽然它适用于我的情况,但我对解决方案不满意,因为 no-sandbox 不是推荐选项

我最后的最小工作代码:

var options = new ChromeOptions();
options.SetLoggingPreference(LogType.Driver, LogLevel.All);
options.AddAdditionalCapability("useAutomationExtension", false);
options.AddArguments("--no-sandbox");
var driver = new ChromeDriver(options);
driver.Navigate().GoToUrl("http://localhost");
Run Code Online (Sandbox Code Playgroud)

SetLoggingPreference不是解决方案的一部分,但它为尝试no-sandbox选项提供了帮助。当 Chrome 选项卡崩溃时,Web 驱动程序抛出以下错误:

[17532:18272:0301/225923.296:ERROR:gpu_process_transport_factory.cc(1009)] 丢失 UI 共享上下文。


在挖掘了更多之后,我找到了一个简单而体面的解决方案:从chromedriver.exe没有提升的情况下开始并使用RemoteWebDriver而不是连接到它ChromeDriver(感谢Tarun Lalwani您指出这种模式):

var options = new ChromeOptions();
options.SetLoggingPreference(LogType.Driver, LogLevel.All);
options.AddAdditionalCapability("useAutomationExtension", false);
var driver = new RemoteWebDriver(new Uri("http://localhost:9515"), options);
driver.Navigate().GoToUrl("http://localhost");
Run Code Online (Sandbox Code Playgroud)