【问题标题】:Selenium: http://localhost:4444/wd/hub returns a NullPointerException, what am I doing incorrectlySelenium:http://localhost:4444/wd/hub 返回 NullPointerException,我做错了什么
【发布时间】:2017-05-31 16:12:01
【问题描述】:

假设:尝试在 C# 中通过此代码使用 RemoteWebDriver。

var url = new Uri("http://localhost:4444/wd/hub");
var wd = new RemoteWebDriver(url, DesiredCapabilities.Chrome());

上面的新 RemoteWebDriver 代码在超时之前不会响应...

更多详情

我已经使用 Selenium 服务器的这些参数启动了我的 Hub:

-jar "C:\SomeFolder\selenium-server-standalone-3.0.1.jar" -port 4444 -role hub

并使用这些参数注册了一个节点..

-jar "C:\SomeFolder\selenium-server-standalone-3.0.1.jar" -role node -hub http://localhost:4444/grid/register -port 9662 

调试

如果我在启动 Hub 后输入这个 URL,它表明有一个已注册的节点:

http://location:4444/grid/console

但是在启动 Hub 后输入这个 url 时

http://localhost:4444/wd/hub

浏览器显示这个指向 ExternalSessionKey.java 的 java (json) 堆栈跟踪

{"status":13,"value":{"class":"java.lang.NullPointerException","stackTrace":[{"fileName":"ExternalSessionKey.java","className":"org.openqa.grid.internal.ExternalSessionKey","methodName":"fromWebDriverRequest","lineNumber":77},{"fileName":"WebDriverRequest.java","className":"org.openqa.grid.web.servlet.handler.WebDriverRequest","methodName":"extractSession","lineNumber":62},{"fileName":"RequestHandler.java","className":"org.openqa.grid.web.servlet.handler.RequestHandler","methodName":"getSession","lineNumber":231},{"fileName":"RequestHandler.java","className":"org.openqa.grid.web.servlet.handler.RequestHandler","methodName":"process","lineNumber":118},{"fileName":"DriverServlet.java","className":"org.openqa.grid.web.servlet.DriverServlet","methodName":"process","lineNumber":83},{"fileName":"DriverServlet.java","className":"org.openqa.grid.web.servlet.DriverServlet","methodName":"doGet","lineNumber":61},{"fileName":"HttpServlet.java","className":"javax.servlet.http.HttpServlet","methodName":"service","lineNumber":687},{"fileName":"HttpServlet.java","className":"javax.servlet.http.HttpServlet","methodName":"service","lineNumber":790},{"fileName":"ServletHolder.java","className":"org.seleniumhq.jetty9.servlet.ServletHolder","methodName":"handle","lineNumber":808},{"fileName":"ServletHandler.java","className":"org.seleniumhq.jetty9.servlet.ServletHandler","methodName":"doHandle","lineNumber":587},{"fileName":"SessionHandler.java","className":"org.seleniumhq.jetty9.server.session.SessionHandler","methodName":"doHandle","lineNumber":221},{"fileName":"ContextHandler.java","className":"org.seleniumhq.jetty9.server.handler.ContextHandler","methodName":"doHandle","lineNumber":1127},{"fileName":"ServletHandler.java","className":"org.seleniumhq.jetty9.servlet.ServletHandler","methodName":"doScope","lineNumber":515},{"fileName":"SessionHandler.java","className":"org.seleniumhq.jetty9.server.session.SessionHandler","methodName":"doScope","lineNumber":185},{"fileName":"ContextHandler.java","className":"org.seleniumhq.jetty9.server.handler.ContextHandler","methodName":"doScope","lineNumber":1061},{"fileName":"ScopedHandler.java","className":"org.seleniumhq.jetty9.server.handler.ScopedHandler","methodName":"handle","lineNumber":141},{"fileName":"HandlerWrapper.java","className":"org.seleniumhq.jetty9.server.handler.HandlerWrapper","methodName":"handle","lineNumber":97},{"fileName":"Server.java","className":"org.seleniumhq.jetty9.server.Server","methodName":"handle","lineNumber":499},{"fileName":"HttpChannel.java","className":"org.seleniumhq.jetty9.server.HttpChannel","methodName":"handle","lineNumber":310},{"fileName":"HttpConnection.java","className":"org.seleniumhq.jetty9.server.HttpConnection","methodName":"onFillable","lineNumber":257},{"fileName":"AbstractConnection.java","className":"org.seleniumhq.jetty9.io.AbstractConnection$2","methodName":"run","lineNumber":540},{"fileName":"QueuedThreadPool.java","className":"org.seleniumhq.jetty9.util.thread.QueuedThreadPool","methodName":"runJob","lineNumber":635},{"fileName":"QueuedThreadPool.java","className":"org.seleniumhq.jetty9.util.thread.QueuedThreadPool$3","methodName":"run","lineNumber":555},{"className":"java.lang.Thread","methodName":"run","lineNumber":-1}]}}

任何人都可以为我解释堆栈跟踪,以及如何使其正常工作?

谢谢!

【问题讨论】:

    标签: java c# selenium selenium-webdriver


    【解决方案1】:

    你没有错。

    URL http://localhost:4444/wd/hub 的设计使其期望您的操作有一个 PAYLOAD。由于您没有提供所需的有效负载,您会看到 NullPointerException。

    不应在浏览器中打开此 URL。它意味着通过 Http 操作使用符合 Selenium w3c spec 的适当有效负载来使用

    【讨论】:

    • 很好,很好地解释了当我在没有任何内容的情况下输入 URL 时的 Web 浏览器堆栈跟踪。但真正的问题是我尝试创建一个新的 RemoteWebDriver 时超时。你对那部分有什么提示吗?
    • 您能否分享更多关于您在实例化 RemoteWebDriver 时遇到的错误的信息?
    • 我总是超时。我认为原因是在我的调试环境中,我让浏览器请求启动并在后续会话中运行。为了解决这个问题,我每次开始测试时都需要重置集线器和节点。在生产模式下,每个 IWebdriver 都会在测试结束时关闭。
    【解决方案2】:

    问题的症状是此代码中的连接超时异常。

    var url = new Uri("http://localhost:4444/wd/hub");
    var wd = new RemoteWebDriver(url, DesiredCapabilities.Chrome());
    

    根本原因

    这是因为,在我的调试会话期间;我在此声明之前结束了程序:

    wd.Quit();
    

    因为我的集线器只配置了一个节点,所以之前的调试会话在集线器上仍然有一个孤立的会话。重新启动集线器解决了这个问题,但也可以根据需要配置任意数量的节点。

    集线器逻辑的另一个错误是孤立节点没有在配置中设置的适当超时时间内被清理。这会导致孤立节点保持活动的时间比超时建议的时间长得多...查看配置选项以亲自查看。应该有一个不活动计时器,显示“如果 x 秒内没有活动”会终止会话。

    一个解决方案

    确保(至少)配置集线器以允许在调试解决方案时需要更多节点。

    【讨论】:

    • Another fault of the Hub logic is that orphaned nodes are not cleaned up in the proper timeout as set in the configuration. This causes orphaned nodes to remain alive for far longer than the timeout suggests... Check out the configuration options to see for yourself. There should be an inactivity timer that says "if no activity in x secconds" kill the session 我也有类似的问题,能告诉我如何解决吗? stackoverflow.com/questions/47427026/…
    猜你喜欢
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 2011-08-17
    相关资源
    最近更新 更多