selenium web驱动程序作为不同的用户运行而没有获得用户的个人资料/会话

时间:2016-12-22 11:50:04

标签: c# windows selenium impersonation

我有一个奇怪的情况,我稍微修改了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(如建议的herehere),而不是修改selenium代码以在另一个用户下运行驱动程序服务,但请求从驱动程序发送到服务器都是在我的用户下发送的,而不是模仿指定的那个(请参阅here

2 个答案:

答案 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