Ale*_*xei 4 selenium google-chrome selenium-chromedriver selenium-webdriver
我在 Chrome 中使用 Selenium Web Driver C# 时遇到了一个常见情况:如果运行测试的进程是“以管理员身份运行”(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);
Run Code Online (Sandbox Code Playgroud)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)Chrome 已打开,但该选项卡无法加载
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 问题有关的问题:
以详细模式运行 Web 驱动程序表明 Chrome 在正常运行与以管理员身份运行时使用完全不同的配置文件路径:
dir="C:\Users\<my-dos-profile-name>\AppData\Local\Temp\scoped_dir21000_25907"每次运行更改)dir="C:\WINDOWS\TEMP\scoped_dir7236_26307"检查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)] 失败
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 驱动程序无关。
我设法使用--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)
| 归档时间: |
|
| 查看次数: |
8040 次 |
| 最近记录: |