HttpServletRequest getRemoteAddr()返回ipv6地址,但无法连接到它

时间:2016-11-17 06:20:25

标签: java spring-mvc selenium ip remotewebdriver

我有一个spring mvc web-app,它基本上在客户端机器上运行selenium测试。

我使用以下命令在客户端系统中创建了一个selenium-hub和节点 -

>java -jar selenium-server-standalone-3.0.1.jar -role hub

>java -Dwebdriver.ie.driver=D:\IEDriver\IEDriverServer.exe -jar selenium-server-standalone-3.0.1.jar -role node -hub http://localhost:4444/grid/register -timeout 20 -browserTimeout 60

我的spring控制器获取url参数并使用RemoteWebDriver在客户端系统中使用该参数运行selenium测试

这是我的弹簧控制器 -

@RequestMapping("/remote-app/{policyNumber}")
    public @ResponseBody String getOIPA(@PathVariable("policyNumber") String polNumber,HttpServletRequest request) throws MalformedURLException
    {
        String clientIp = request.getRemoteAddr();
        System.out.println("Input policy number : "+polNumber);
        System.out.println("Client IP : "+clientIp);
        oipaService.openOipaAddressScreenRemote(polNumber,clientIp);
        return "hello  "+polNumber+"   "+clientIp;
    }

这是我运行测试的服务方法 -

public void openOipaAddressScreenRemote(String policyNumber,String ip) throws MalformedURLException {

        System.out.println("Policy number input : "+policyNumber);
        String oipaURL = "https://mydom.com/PASJava_Term";
        String userName = "user";
        String password = "pwd";

        //-------------------

        String remoteUrlString = "http://"+ip+":4444/wd/hub";
        System.out.println(remoteUrlString);
        DesiredCapabilities caps = DesiredCapabilities.internetExplorer();

        caps.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);

        WebDriver driver = new RemoteWebDriver(new URL(remoteUrlString),caps);


        //-------------------

        driver.get(oipaURL);}

它在我的组织的客户端系统(PC)中为我提供了期望的结果,该客户端系统连接到客户端的IPv4地址。

但问题是,当我在我的组织中使用笔记本电脑客户端时,它会返回IPv6,该应用程序无法连接。

他们通过笔记本电脑名称连接,例如 - lt00123 。 即selenium RemoteWebDriver能够连接到http://lt00123:4444/wd/hub

如果可能的话,如何根据需要识别客户端地址(ipv4或机器名称)。

编辑:使用here 解决方案后,我解决了IPv6问题。从here我发现我需要在一台机器(最好是在服务器位置)设置集线器,并在客户端机器上使用集线器设置节点。现在我的春季控制器不需要知道客户的地址。它已经知道了枢纽的位置。

1 个答案:

答案 0 :(得分:0)

原始问题的解决方案是graph

我对代码做了一些改动 -

在服务器位置设置集线器 -

>java -jar selenium-server-standalone-3.0.1.jar -role hub -port 4444

在客户端计算机上设置节点 -

>java -Dwebdriver.ie.driver=D:\IEDriver\IEDriverServer.exe -jar selenium-server-standalone-3.0.1.jar -role node -hub http://[server ip]:4444/grid/register -timeout 20 -browserTimeout 60

控制器 -

   @RequestMapping("/remote-app/{policyNumber}")
        public @ResponseBody String getOIPA(@PathVariable("policyNumber") String polNumber) throws MalformedURLException
        {
            String clientIp = request.getRemoteAddr();
            System.out.println("Input policy number : "+polNumber);
            oipaService.openOipaAddressScreenRemote(polNumber);
            return "hello  "+polNumber;
        }

服务方法 -

public void openOipaAddressScreenRemote(String policyNumber) throws MalformedURLException {

        System.out.println("Policy number input : "+policyNumber);
        String oipaURL = "https://mydom.com/PASJava_Term";
        String userName = "user";
        String password = "pwd";

        //-------------------

        String remoteUrlString = "http://"+{server ip here}+":4444/wd/hub";
        System.out.println(remoteUrlString);
        DesiredCapabilities caps = DesiredCapabilities.internetExplorer();

        caps.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);

        WebDriver driver = new RemoteWebDriver(new URL(remoteUrlString),caps);


        //-------------------

        driver.get(oipaURL);
}

现在我的控制器不需要知道客户端的IP。我不是在每台客户机中使用一个集线器和一个节点,而是在服务器中使用一个集线器,在每个客户机中使用一个节点。

现在,我可以在多个客户端上的客户端系统上从客户端进行测试。