Selenium Webdriver中SessionID的使用是什么?
考虑打开5个浏览器的场景,每个浏览器都有自己的sessionid。我们可以使用这些sessionid来关闭各自的浏览器吗?如果是这样,我们如何在C#中做到这一点?
答案 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;
}
}