我已经在Selenium中创建了一个会话,通过获取会话ID,local_url并重新使用它来重新使用它。这意味着新会话将继续原始会话。函数getAttribute()
在继续的会话中不起作用,但是如果我将其放在原始会话中,则可以正常工作。我只遇到getAttribute()
的问题,而其他硒功能(例如getText()
,getCss()
的效果很好。
这是重复使用代码:
RemoteWebDriver driver = createDriverFromSession(session_id, local_url);
System.out.println(driver.findElement(By.xpath(xpath)).getAttribute(attribute));
输出:
{message=unknown error: a.getAttributeNode is not a function
(Session info: chrome=67.0.3396.99)
(Driver info: chromedriver=2.40.565498 (ea082db3280dd6843ebfb08a625e3eb905c4f5ab),platform=Windows NT 10.0.14393 x86_64)}
请有人帮我。谢谢!
答案 0 :(得分:2)
我确实遇到了一些问题-> message =未知错误:a.getAttributeNode不是函数
随着我开始更多调试,我发现-Chrome没有使用W3C编解码器。所以我更改了代码以进行相应的反映。功能也已更改。
new W3CHttpCommandCodec to new JsonHttpCommandCodec()
new W3CHttpResponseCodec to new JsonHttpResponseCodec()
new RemoteWebDriver(executor, new DesiredCapabilities()) to return
new RemoteWebDriver(url, DesiredCapabilities.chrome())
这适用于我的示例。使用硒版本3.14.0,但不要紧。
答案 1 :(得分:0)
以上答案对我有用,但我想提供更多背景信息。
最初,我寻求重新连接到现有Selenium会话的方法,而不是打开一个新会话。我在网上的另一篇文章中找到了createDriverFromSession
方法(下面找不到它的链接)。那篇文章包含下面的代码。我从上面的答案中注释掉了需要更改的行。
public static RemoteWebDriver createDriverFromSession(final SessionId sessionId, URL command_executor){
CommandExecutor executor = new HttpCommandExecutor(command_executor) {
@Override
public Response execute(Command command) throws IOException {
Response response = null;
if (command.getName() == "newSession") {
response = new Response();
response.setSessionId(sessionId.toString());
response.setStatus(0);
response.setValue(Collections.<String, String>emptyMap());
try {
Field commandCodec = null;
commandCodec = this.getClass().getSuperclass().getDeclaredField("commandCodec");
commandCodec.setAccessible(true);
// commandCodec.set(this, new W3CHttpCommandCodec());
commandCodec.set(this, new JsonHttpCommandCodec());
Field responseCodec = null;
responseCodec = this.getClass().getSuperclass().getDeclaredField("responseCodec");
responseCodec.setAccessible(true);
// responseCodec.set(this, new W3CHttpResponseCodec());
responseCodec.set(this, new JsonHttpResponseCodec());
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} else {
response = super.execute(command);
}
return response;
}
};
// return new RemoteWebDriver(executor, new DesiredCapabilities());
return new RemoteWebDriver(executor, DesiredCapabilities.chrome());
}
答案 2 :(得分:0)
我也终于解决了这个问题。就像上面提到的那样,这与 W3C 有关。
我是这样做的:
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setExperimentalOption("w3c", false);
capabilities.setCapability("chromeOptions", chromeOptions);
我只是去掉了这些盖子,它按预期工作。