我们最近迁移到了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命令组合,但仍然面临相同的问题。请帮助我们解决此问题。
1条答案
按热度按时间stszievb1#
我认为这个问题是由于Selenium无法将您的请求作为有效的JSON信息处理而引起的,可能正如您所猜测的那样,因为您错过了双引号。
我的建议是,首先尝试从终端发出
curl
命令,看看它是否有效。Selenium文档提供了一个可供参考的示例:
请注意,他们是如何将
query
和GraphQL查询本身定义为有效的JSON对象的,以及他们是如何转义会话标识符的。在Java代码中,这意味着将命令更改为如下形式:
再次注意会话标识符的处理。
请考虑阅读this related Github issue,我想它也会有帮助。
另外,尽管Selenium文档本身建议使用
curl
,但是在Java中,您可以尝试不同的方法,并尝试以其他方式获取信息。