在SessionID的c#用法中的Selenium Webdriver

时间:2014-08-05 01:30:42

标签: c# selenium webdriver

Selenium Webdriver中SessionID的使用是什么?

考虑打开5个浏览器的场景,每个浏览器都有自己的sessionid。我们可以使用这些sessionid来关闭各自的浏览器吗?如果是这样,我们如何在C#中做到这一点?

2 个答案:

答案 0 :(得分:0)

通常,会话ID是内部实现细节,最终用户不必关心它们。通过调用.Quit()方法,可以终止浏览器会话以及正在运行的浏览器实例。即:

// Launch one instance of Firefox
IWebDriver driver1 = new FirefoxDriver();

// Launch a second instance of Firefox,
// which can be controlled independently
// of the first.
IWebDriver driver2 = new FirefoxDriver();

// Exit the first Firefox instance (the second
// remains running.
driver1.Quit();

// Exit the second instance.
driver2.Quit();

但是,必须注意WebDriver只能操作通过WebDriver启动的浏览器实例。目前无法连接到现有的正在运行的浏览器实例,也不可能存在。

答案 1 :(得分:0)

使用会话ID可以帮助您在远程Web驱动程序上连接会话。 您可以使用以下命令获取会话ID:

var sessionIdProperty = typeof(RemoteWebDriver).GetProperty("sessionId", BindingFlags.Instance | BindingFlags.NonPublic); //sessionId
            if (sessionIdProperty != null)
            {
                SessionId sessionId = sessionIdProperty.GetValue(driver, null) as SessionId;
                sId = sessionId.ToString();//((RemoteWebDriver)driver).Capabilities.GetCapability("webdriver.remote.sessionid").ToString();

            }

之后 - 您可以使用以下方法重新连接到会话:

    IWebDriver driverReUse = new ReuseRemoteWebDriver(uri, sId);

鉴于您有一个允许重用远程webdriver的类。

public class ReuseRemoteWebDriver : OpenQA.Selenium.Remote.RemoteWebDriver
{
    private String _sessionId;

public ReuseRemoteWebDriver(Uri remoteAddress, String sessionId)
    : base(remoteAddress, new OpenQA.Selenium.Remote.DesiredCapabilities())
{
    this._sessionId = sessionId;
    var sessionIdBase = this.GetType()
        .BaseType
        .GetField("sessionId",
                  System.Reflection.BindingFlags.Instance |
                  System.Reflection.BindingFlags.NonPublic);
    sessionIdBase.SetValue(this, new OpenQA.Selenium.Remote.SessionId(sessionId));
}

protected override OpenQA.Selenium.Remote.Response
    Execute(string driverCommandToExecute, System.Collections.Generic.Dictionary<string, object> parameters)
{
    if (driverCommandToExecute == OpenQA.Selenium.Remote.DriverCommand.NewSession)
    {
        var resp = new OpenQA.Selenium.Remote.Response();
        resp.Status = OpenQA.Selenium.WebDriverResult.Success;
        resp.SessionId = this._sessionId;
        resp.Value = new System.Collections.Generic.Dictionary<String, Object>();
        return resp;
    }
    var respBase = base.Execute(driverCommandToExecute, parameters);
    return respBase;
}

}