在Selenium中继续会话无法getAttribute()

时间:2018-07-17 11:18:45

标签: selenium

我已经在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)}

请有人帮我。谢谢!

3 个答案:

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

我只是去掉了这些盖子,它按预期工作。