curl 查询:进行查询以获取给定会话的会话信息时出现JSON解析器错误

cygmwpex  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(145)

我们最近迁移到了Selenium 4.3.0,发现用于获取会话节点IP和端口的API完全改变了,现在必须通过graphql进行捕获。因此,我们做了相应的更改,但在通过Java代码运行时仍然出现错误。
更新了java中的命令:

String[] command = {"curl", "-X", "POST", "-H", "Content-Type: application/json", "--data", "{query: { session (id: \""+sessionId+"\") { id, capabilities, startTime, uri, nodeId, nodeUri, sessionDurationMillis, slot { id, stereotype, lastStarted } } } }", "-s", "http://localhost:4444/graphql"};
ProcessBuilder process = new ProcessBuilder(command); 
            
            Process p;
            try
            {
                p = process.start();
                 BufferedReader reader =  new BufferedReader(new InputStreamReader(p.getInputStream()));
                    StringBuilder builder = new StringBuilder();
                    String line = null;
                    while ( (line = reader.readLine()) != null) {
                            builder.append(line);
                            builder.append(System.getProperty("line.separator"));
                    }
                    String result = builder.toString();
                    System.out.print(result);

            }

控制台O/P错误:

{
  "value": {
    "error": "unknown error",
    "message": "Unable to parse: {query: { session (id: d5382daee94860671ae972fcba359e03) { id, capabilities, startTime, uri, nodeId, nodeUri, sessionDurationMillis, slot { id, stereotype, lastStarted } } } }",
    "stacktrace": "org.openqa.selenium.json.JsonException: Unable to parse: {query: { session (id: d5382daee94860671ae972fcba359e03) { id, capabilities, startTime, uri, nodeId, nodeUri, sessionDurationMillis, slot { id, stereotype, lastStarted } } } }\r\n\tat org.openqa.selenium.json.Json.toType(Json.java:57)\r\n\tat org.openqa.selenium.json.Json.toType(Json.java:50)\r\n\tat org.openqa.selenium.grid.graphql.GraphqlHandler.execute(GraphqlHandler.java:114)\r\n\tat org.openqa.selenium.remote.http.Route$TemplatizedRoute.handle(Route.java:192)\r\n\tat org.openqa.selenium.remote.http.Route.execute(Route.java:68)\r\n\tat org.openqa.selenium.remote.http.Route$CombinedRoute.handle(Route.java:336)\r\n\tat org.openqa.selenium.remote.http.Route.execute(Route.java:68)\r\n\tat org.openqa.selenium.remote.http.Route$CombinedRoute.handle(Route.java:336)\r\n\tat org.openqa.selenium.remote.http.Route.execute(Route.java:68)\r\n\tat org.openqa.selenium.remote.AddWebDriverSpecHeaders.lambda$apply$0(AddWebDriverSpecHeaders.java:35)\r\n\tat org.openqa.selenium.remote.ErrorFilter.lambda$apply$0(ErrorFilter.java:44)\r\n\tat org.openqa.selenium.remote.http.Filter$1.execute(Filter.java:64)\r\n\tat org.openqa.selenium.remote.ErrorFilter.lambda$apply$0(ErrorFilter.java:44)\r\n\tat org.openqa.selenium.remote.http.Filter$1.execute(Filter.java:64)\r\n\tat org.openqa.selenium.netty.server.SeleniumHandler.lambda$channelRead0$0(SeleniumHandler.java:44)\r\n\tat java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)\r\n\tat java.util.concurrent.FutureTask.run(FutureTask.java:266)\r\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\r\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\r\n\tat java.lang.Thread.run(Thread.java:748)\r\nCaused by: org.openqa.selenium.json.JsonException: Unable to determine type from: q. Last 2 characters read: {q\nBuild info: version: '4.3.0', revision: 'a4995e2c09*'\nSystem info: host: '13.12.13.14', ip: '127.0.0.1', os.name: 'Windows Server 2019', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_271'\nDriver info: driver.version: unknown\r\n\tat org.openqa.selenium.json.JsonInput.peek(JsonInput.java:126)\r\n\tat org.openqa.selenium.json.JsonInput.hasNext(JsonInput.java:207)\r\n\tat org.openqa.selenium.json.JsonInputIterator.hasNext(JsonInputIterator.java:41)\r\n\tat java.util.Iterator.forEachRemaining(Iterator.java:115)\r\n\tat java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)\r\n\tat java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)\r\n\tat java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)\r\n\tat java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)\r\n\tat java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)\r\n\tat java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)\r\n\tat org.openqa.selenium.json.MapCoercer.lambda$apply$1(MapCoercer.java:72)\r\n\tat org.openqa.selenium.json.JsonTypeCoercer.lambda$buildCoercer$6(JsonTypeCoercer.java:145)\r\n\tat org.openqa.selenium.json.JsonTypeCoercer.coerce(JsonTypeCoercer.java:127)\r\n\tat org.openqa.selenium.json.Json.toType(Json.java:71)\r\n\tat org.openqa.selenium.json.Json.toType(Json.java:55)\r\n\t... 19 more\r\n"
  }

Showing error somewhere here in --data ".json.JsonException: Unable to determine type from: q. Last 2 characters read: {q\n英寸
我们尝试了不同的curl命令组合,但仍然面临相同的问题。请帮助我们解决此问题。

stszievb

stszievb1#

我认为这个问题是由于Selenium无法将您的请求作为有效的JSON信息处理而引起的,可能正如您所猜测的那样,因为您错过了双引号。
我的建议是,首先尝试从终端发出curl命令,看看它是否有效。
Selenium文档提供了一个可供参考的示例:

curl -X POST -H "Content-Type: application/json" --data '{"query":"{ session (id: \"<session-id>\") { id, capabilities, startTime, uri, nodeId, nodeUri, sessionDurationMillis, slot { id, stereotype, lastStarted } } } "}' -s <LINK_TO_GRAPHQL_ENDPOINT>

请注意,他们是如何将query和GraphQL查询本身定义为有效的JSON对象的,以及他们是如何转义会话标识符的。
在Java代码中,这意味着将命令更改为如下形式:

String[] command = {
  "curl",
  "-X", "POST",
  "-H", "Content-Type: application/json",
  "--data", "{ \"query\": \"{ session (id: \\\""+sessionId+"\\\") { id, capabilities, startTime, uri, nodeId, nodeUri, sessionDurationMillis, slot { id, stereotype, lastStarted } } } \"}",
  "-s", "http://localhost:4444/graphql"
};

再次注意会话标识符的处理。
请考虑阅读this related Github issue,我想它也会有帮助。
另外,尽管Selenium文档本身建议使用curl,但是在Java中,您可以尝试不同的方法,并尝试以其他方式获取信息。

URL url = new URL("http://localhost:4444/graphql");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");

String sessionId = "123456";

String query = "{ \"query\": \"{ session (id: \\\""+sessionId+"\\\") { id, capabilities, startTime, uri, nodeId, nodeUri, sessionDurationMillis, slot { id, stereotype, lastStarted } } } \"}";

OutputStream os = conn.getOutputStream();
os.write(query.getBytes());
os.flush();

BufferedReader br = new BufferedReader(new InputStreamReader(
  (conn.getInputStream())));

StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
  sb.append(line);
  sb.append(System.getProperty("line.separator"));
}

String result = sb.toString();

System.out.println("Response from Selenium .... \n" + result);

conn.disconnect();

相关问题