C# Selenium ChromeDriver:以管理员身份运行时,Google Chrome无法启动

4

在使用 Selenium Web Driver C# 和 Chrome 时,我遇到了一个不寻常的情况:如果运行测试的进程是以“管理员身份运行”的(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. Start a test that also initializes the driver

    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);
    
  2. ChromeDriver starts successfully:

    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
    
  3. Chrome is opened, but the tab fails to load

chrome failed tab

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

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

其他信息:会话未创建异常

来自标签崩溃的消息

(会话信息:chrome=64.0.3282.167)

(驱动程序信息:chromedriver=2.35.528161(5b82f2d2aae0ca24b877009200ced9065a772e73),平台=Windows NT 6.1.7601 SP1 x86_64) (不安全证书)

我无法确定失败的原因。我觉得它可能与此问题有关,但该问题涉及另一个用户,并非以提升模式相同的用户。

问题:为什么以管理员身份运行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");
}

我在公司外的另一台电脑上进行了测试,不管是Chrome Driver 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安装文件夹中的chrome.debug文件(每个临时配置文件中也会创建一个调试文件),我看到以下错误:

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

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

C:\Program Files (x86)\Google\Chrome\Application>[7244:16744:0303/125934.383:ERROR:gpu_process_transport_factory.cc(1009)] Lost UI shared context.
[7244:13716:0303/125956.057:ERROR:connection_factory_impl.cc(381)] Failed to connect to MCS endpoint with error -118

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


@TarunLalwani - 请问您能指示2.36的下载来源吗?Chrome驱动程序下载仅支持到2.36,NuGet包管理器也是如此(Selenium.Chrome.WebDriver包的最新版本为2.35)。 - Alexei - check Codidact
我在我的 packages.config 文件中使用了以下代码 <package id="Selenium.WebDriver.ChromeDriver" version="2.36.0" targetFramework="net461" /> - Tarun Lalwani
@TarunLalwani - 另外,在我的原始设置中(Windows 7,公司应用的本地策略),2.36与2.35完全失败。 - Alexei - check Codidact
当发生此情况时,您能否检查Windows事件查看器,以查看是否记录了任何错误日志? - Tarun Lalwani
@Alexei,如果问题是配置文件的位置,您可以在启动驱动程序之前覆盖临时文件夹来更改它:Environment.SetEnvironmentVariable("TMP", "C:\\TEMP"); - Florent B.
显示剩余10条评论
1个回答

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");

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

[17532:18272:0301/225923.296:ERROR:gpu_process_transport_factory.cc(1009)] Lost UI shared context.


深入研究后,我找到了一个简单而不错的解决方案:以非管理员身份启动 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");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接