我有一个奇怪的情况,我稍微修改了selenium web驱动程序代码以允许在不同的用户下启动驱动程序服务,从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
并让会话保持打开状态)那么浏览器的所有功能都会按预期启动通过selenium web驱动程序,包括自动响应NTLM挑战。
如果我在创建Web驱动程序之前使用Process.Start()
将cmd.exe作为所需用户启动,则无效。
我的问题是:
与从命令行启动进程的交互式会话相比,以编程方式(使用Process.Start()
)启动进程有何不同?
有没有什么方法可以忠实地重现在代码中从命令行启动会话的效果,这样我就可以自动执行该过程并让我的Web驱动程序按照我的意愿执行?
注意:我尝试使用.net模拟启动webdriver(如建议的here和here),而不是修改selenium代码以在另一个用户下运行驱动程序服务,但请求从驱动程序发送到服务器都是在我的用户下发送的,而不是模仿指定的那个(请参阅here)
答案 0 :(得分:2)
您是否尝试过此设置?
let arr = "hey ho ha".characters.split(separator:" ").map{String($0)}
arr // ["hey", "ho", "ha"]
答案 1 :(得分:1)
当前Selenium .NET源不再需要此技术。现在,ProcessStartInfo
事件允许用户修改用于启动驱动程序服务过程的public class User
{
public string UserName { get; set; }
public SecureString Password { get; set; }
public string Domain { get; set; }
public bool LoadUserProfile { get; set; }
}
对象。完成此操作的代码如下所示:
假设您的用户对象看起来像这样:
public IWebDriver StartInternetExplorerDriver(InternetExplorerOptions options, User user)
{
InternetExplorerDriverService service = InternetExplorerDriverService.CreateDefaultService();
service.DriverProcessStarting += (object sender, DriverProcessStartingEventArgs e) =>
{
e.DriverServiceProcessStartInfo.UserName = user.UserName;
e.DriverServiceProcessStartInfo.Password = user.Password;
e.DriverServiceProcessStartInfo.Domain = user.Domain;
e.DriverServiceProcessStartInfo.LoadUserProfile = user.LoadUserProfile;
};
return new InternetExplorerDriver(service, options);
}
您可以使用以下内容:
SELECT key, ROW_NUMBER() OVER (PARTITION BY key ORDER BY rt) FROM InputTable