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

时间:2018-02-15 16:17:15

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

我在使用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. 启动一个也初始化驱动程序的测试

    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已打开,但无法加载标签

  4. chrome failed tab

    1. 如果我在附加时刷新标签,则会收到以下异常信息:
    2.   

      类型' System.InvalidOperationException'的例外情况发生在   WebDriver.dll但未在用户代码中处理

           

      其他信息:会话未创建例外

           

      来自标签崩溃

           

      (会话信息:chrome = 64.0.3282.167)

           

      (司机资料:chromedriver = 2.35.528161   (5b82f2d2aae0ca24b877009200ced9065a772e73),platform = Windows NT   6.1.7601 SP1 x86_64)(InsecureCertificate)

      我无法理解失败的原因。我觉得它可能已连接this issue,但该问题涉及另一个用户,而不是提升模式下的同一用户。

      问题:为什么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驱动程序如何,它都能正常运行(同时尝试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文件(在每个临时配置文件中也创建了一个调试文件)我看到了以下错误:

      3.   

        [0303 / 120050.213:错误:process_reader_win.cc(151)] SuspendThread:   访问被拒绝。 (0x5)
          [0303 / 120050.214:错误:process_reader_win.cc(123)] NtOpenThread:   {Access Denied}进程已请求访问对象,但具有   没有被授予那些访问权限。 (0xc0000022)
          [0303 / 120050.215:错误:exception_snapshot_win.cc(88)]线程ID 13672   在过程中找不到
          [0303 / 120050.215:警告:crash_report_exception_handler.cc(62)]   ProcessSnapshotWin :: Initialize failed

        1. 如果我只是以管理员身份运行Chrome,则所有恢复标签都会崩溃,我会在日志中获得类似的错误。控制台(cmd)输出说:
        2.   

          C:\ Program Files   (86)\谷歌\铬\应用程序&gt; [7244:16744:0303 / 125934.383:错误:gpu_process_transport_factory.cc(1009)]   丢失的UI共享上下文。
            [7244:13716:0303 / 125956.057:错误:connection_factory_impl.cc(381)]   无法连接到MCS端点,错误为-118

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

1 个答案:

答案 0 :(得分:4)

我设法使用--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标签崩溃时,网络驱动程序抛出以下错误:

  

[17532:18272:0301 / 225923.296:错误: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");