我有一个奇怪的情况,我稍微修改了seleniumweb驱动程序代码,以允许在不同的用户下启动驱动程序服务,从github更改代码:
public void Start() { this.driverServiceProcess = new Process(); if (this.user != null) { this.driverServiceProcess.StartInfo.UserName = user.Name; this.driverServiceProcess.StartInfo.Password = user.Password; this.driverServiceProcess.StartInfo.Domain = user.Domain; } this.driverServiceProcess.StartInfo.FileName = Path.Combine(this.driverServicePath, this.driverServiceExecutableName); this.driverServiceProcess.StartInfo.Arguments = this.CommandLineArguments; this.driverServiceProcess.StartInfo.UseShellExecute = false; this.driverServiceProcess.StartInfo.CreateNoWindow = this.hideCommandPromptWindow; this.driverServiceProcess.Start(); bool serviceAvailable = this.WaitForServiceInitialization(); if (!serviceAvailable) { string msg = "Cannot start the driver service on " + this.ServiceUrl; throw new WebDriverException(msg); } }
其中用户详细信息从调用中的外部代码传入以实例化Web驱动程序:
new ChromeDriver(userName, password, domain);
要么
new InternetExplorerDriver(ieOptions, userName, password, domain);
并通过传播。
这在所需的用户凭据下成功启动了chrome驱动程序,但IE有问题。
此外,chrome驱动程序与手动启动chrome的行为不同(即不通过selenium驱动程序)。 特别是在NTLM质询上自动传递用户凭据不会发生。
我发现,如果我有一个以所需用户身份运行的交互式会话(只需使用命令行中的runas /user:<theUser> cmd.exe
并将会话保持打开状态),那么所有浏览器的function都是预期的通过selenium web驱动程序启动时,包括自动响应NTLM挑战。
如果我在创buildWeb驱动程序之前使用Process.Start()
作为所需用户启动cmd.exe,则不起作用。
我的问题是这样的:
与从命令行启动进程的交互式会话相比,以编程方式启动进程(使用Process.Start()
)有什么不同?
有没有什么办法可以忠实地再现从代码中的命令行启动会话的效果,这样我就可以自动执行该过程并让我的Web驱动程序按照我的意愿执行?
注意:我尝试使用.net模拟(正如这里和这里所build议的)启动webdriver,而不是修改selenium代码以在另一个用户下运行驱动程序服务,但是从驱动程序发送到服务器的请求全部是在我的用户下发送的比冒名顶替(参见这里 )
你试过这个设置吗?
this.driverServiceProcess.StartInfo.LoadUserProfile = true;