【发布时间】:2021-09-11 16:53:30
【问题描述】:
我使用了这个由 Tarun Lalwani 设计的method,通过在 C# 中重用 url 和 sessionID 来附加 Selenium Chrome 驱动程序。此附加部分有效,但某些驱动程序方法(例如 FindElement(By.ID) 显示错误 "invalid argument: invalid locator (Session info: chrome=91.0.4472.114)" 在此行:
var respBase = base.Execute(driverCommandToExecute, parameters);
我的猜测是,当附加驱动程序时,选项或所需功能为空。但我还没有找到在 ReuseRemoteWebDriver 上正确设置它的方法。 含有附属的司机的样子的图片 here。 我该如何解决这个问题,以便我可以附加以前的 chrome 驱动程序并保留所有预期的 selenium 功能?
static void Main(string[] args)
{
InputSimulator teclado = new InputSimulator();
ChromeOptions options = new ChromeOptions();
options.UseSpecCompliantProtocol = true;
ChromeDriverService service = ChromeDriverService.CreateDefaultService(@"Thepathofchromedriver");
IWebDriver driver;
DesiredCapabilities capabilities = new DesiredCapabilities();
Uri myUri = new Uri("http://127.0.0.1:65431", UriKind.Absolute);
service.Port = 65431;
string ID = "1f42d5f0ad105910e8d2fc7be23480a9";
if (ID != "")
{
IWebDriver drivertest1 = new ChromeDriver(service, options);
IWebDriver drivertest = new ReuseRemoteWebDriver(myUri, ID,capabilities,options);
driver = drivertest;
}
else
{
IWebDriver drivertest = new ChromeDriver(service,options);
driver = drivertest;
}
IWebElement inputUser = driver.FindElement(By.Id("ID"));}
public class ReuseRemoteWebDriver : OpenQA.Selenium.Remote.RemoteWebDriver
{
private String _sessionId;
public ReuseRemoteWebDriver(Uri remoteAddress, String sessionId, OpenQA.Selenium.Remote.DesiredCapabilities capability, ChromeOptions options)
: base(remoteAddress,options)
{
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;
}
}
更新:正如我在回复中指出的那样,我可以解决大多数问题。 我无法恢复的最重要的功能是注入 js 脚本
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
var script = "your script";
js.ExecuteScript(script);
任何关于如何恢复注入脚本功能的想法将不胜感激。
【问题讨论】:
标签: c# selenium google-chrome selenium-webdriver selenium-chromedriver