【问题标题】:C# Selenium ChromeDriver: Google Chrome fails when run as administratorC# Selenium ChromeDriver:Google Chrome 以管理员身份运行时失败
【发布时间】:2018-02-15 16:17:15
【问题描述】:

我在 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);
    
  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
    
  3. Chrome 已打开,但标签页无法加载

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

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

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

从标签崩溃

(会话信息:chrome=64.0.3282.167)

(驱动程序信息:chromedriver=2.35.528161 (5b82f2d2aae0ca24b877009200ced9065a772e73),平台=Windows NT 6.1.7601 SP1 x86_64) (InsecureCertificate)

我不知道为什么它失败了。我觉得它可能已连接this issue,但问题涉及另一个用户,而不是提升模式下的同一用户。

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


我已经按照 cmets 中的建议创建了一个小型控制台应用程序:

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 驱动程序如何(尝试了 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)] 挂起线程: 访问被拒绝。 (0x5)
[0303/120050.214:错误:process_reader_win.cc(123)] NtOpenThread: {Access Denied} 进程已请求访问对象,但已 没有被授予这些访问权限。 (0xc0000022)
[0303/120050.215:ERROR:exception_snapshot_win.cc(88)] 线程 ID 13672 在进程中找不到
[0303/120050.215:警告:crash_report_exception_handler.cc(62)] ProcessSnapshotWin::Initialize 失败

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

C:\程序文件 (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 驱动程序无关。

【问题讨论】:

  • 您是否从可能是证书问题的基础上对此进行了研究?谷歌搜索“chrome InsecureCertificate”发现了很多有趣的链接,但坦率地说,它们大部分都超出了我的想象。
  • @BillHileman - --ignore-certificate-errors 应该处理证书问题。无论如何,即使我对托管在 localhost(http 连接)中的网站运行 selenium,也会发生这种情况,所以我怀疑这个问题与证书有关。
  • @BillHileman - 另一个有趣的方面是它在 Firefox 上运行良好。另外,我注意到如果“以其他用户身份运行”,Chrome(和其他浏览器不会)无法工作,所以我觉得它可能与它处理配置文件数据的方式有关。
  • 看来您链接到的问题自 2012 年以来一直是一个问题,并且从未解决,至少根据那里的一条评论。我希望我能提供一些帮助。
  • 您能否在没有 nunit 的简单控制台应用程序中重现该问题?尝试提高日志级别,看看是否记录了原因(chromium.org/for-testers/enable-logging)。

标签: google-chrome selenium selenium-webdriver selenium-chromedriver


【解决方案1】:

我设法使用--no-sandbox 选项绕过了这个问题。虽然它适用于我的情况,但我对解决方案 since no-sandbox is not a recommended option 不满意。

我最终的最小工作代码:

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)] 丢失 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");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 2012-11-22
    • 2015-04-24
    相关资源
    最近更新 更多