在使用 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 扩展
步骤
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);
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
Chrome is opened, but the tab fails to load
- 如果我在附加时刷新选项卡,则会收到以下异常信息:
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问题有关:
以详细模式运行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: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 失败
- 如果我只是以管理员身份运行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驱动程序无关。
packages.config
文件中使用了以下代码<package id="Selenium.WebDriver.ChromeDriver" version="2.36.0" targetFramework="net461" />
。 - Tarun LalwaniEnvironment.SetEnvironmentVariable("TMP", "C:\\TEMP");
- Florent B.