我在使用Selenium Web Driver C#和Chrome时遇到了一个常见的情况:如果运行测试的进程是"以管理员身份运行" (Visual Studio或nunit3-console.exe
)Chrome无法加载。
上下文
步骤
启动一个也初始化驱动程序的测试
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);
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
Chrome已打开,但无法加载标签
类型' 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问题相关的内容:
以详细模式运行Web驱动程序表明Chrome在正常运行时使用完全不同的配置文件路径而不是以管理员身份运行:
dir="C:\Users\<my-dos-profile-name>\AppData\Local\Temp\scoped_dir21000_25907"
(每次运行更改)dir="C:\WINDOWS\TEMP\scoped_dir7236_26307"
在Chrome的安装文件夹中检查chrome.debug
文件(在每个临时配置文件中也创建了一个调试文件)我看到了以下错误:
[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
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驱动程序无关。
答案 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");