WebDriver getCurrentUrl()返回格式错误的URI

时间:2015-03-12 18:11:21

标签: java selenium-webdriver uri url-encoding selenium-firefoxdriver

我参与了使用Selenium 2和FireFox驱动程序编写(Java / Groovy)浏览器自动化应用程序。

目前我们在野外发现的某些网址存在问题,这些网址显然是使用错误的 URI语法。 (特别是花括号({}),|' s和^' s)。

String url = driver.getCurrentUrl(); // http://example.com/foo?key=val|with^bad{char}acters

当尝试从java.net.URI返回的字符串构造driver.getCurrentUrl()时,会抛出URISyntaxException

new URI(url); // java.net.URISyntaxException: Illegal character in query at index ...
在构建url之前

编码整个URI将无效(据我所知)。

整个网址已经过编码,并且它没有预先设置我能以任何正常方式解析的任何部分。例如,使用此uri-safe字符串,URI无法知道&作为查询字符串参数分隔符或%26(其编码值)之间的差异单个qs-param的内容。

String encoded = URLEncoder.encode(url, "UTF-8") // http%3A%2F%2Fexample.com%2Ffoo%3Fkey%3Dval%7Cwith%5E%7Cbad%7Ccharacters
URI uri = new URI(encoded)
URLEncodedUtils.parse(uri, "UTF-8") // []

目前解决方案是,在构建URI之前,运行以下(groovy)代码:

["|", "^", "{", "}"].each {
    url = url.replace(it, URLEncoder.encode(it, "UTF-8"))
}

但这看起来很脏又错。

我想我的问题是多部分的:

  1. 为什么FirefoxDriver会返回String而不是URI?
  2. 为什么这个字符串格式不正确?
  3. 处理此类事情的最佳做法是什么?

4 个答案:

答案 0 :(得分:2)

我们可以对查询字符串参数进行部分编码,如注释中所述,它应该可以工作。

其他方式是使用galimatias库:

import io.mola.galimatias.GalimatiasParseException;
import io.mola.galimatias.URL;

import java.net.URI;
import java.net.URISyntaxException;

public class Main {

    public static void main(String[] args) throws URISyntaxException {
        String example1 = "http://example.com/foo?key=val-with-a-|-in-it";
        String example2 = "http://example.com?foo={bar}";

        try {
            URL url1 = URL.parse(example1);
            URI uri1 = url1.toJavaURI();
            System.out.println(url1);
            System.out.println(uri1);

            URL url2 = URL.parse(example2);
            URI uri2 = url2.toJavaURI();
            System.out.println(url2);
            System.out.println(uri2);
        } catch (GalimatiasParseException ex) {
            // Do something with non-recoverable parsing error
        }
    }
}

输出:

http://example.com/foo?key=val-with-a-|-in-it
http://example.com/foo?key=val-with-a-%7C-in-it
http://example.com/?foo={bar}
http://example.com/?foo=%7Bbar%7D

答案 1 :(得分:0)

driver.getCurrentUrl()从浏览器中获取一个字符串,在将其作为URL之前,您应该对该字符串进行URL编码。

请参阅Java URL encoding of query string parameters以获取Java中的示例。

答案 2 :(得分:0)

这对你有用吗?

import java.net.URI;
import java.net.URL;
import java.net.URLEncoder;


public class Sample {

public static void main(String[] args) throws UnsupportedEncodingException {
    String urlInString="http://example.com/foo?key=val-with-a-{-in-it";
    String encodedURL=URLEncoder.encode(urlInString, "UTF-8");

    URI encodedURI=URI.create(encodedURL);
    System.out.println("Actual URL:"+urlInString);
    System.out.println("Encoded URL:"+encodedURL);
    System.out.println("Encoded URI:"+encodedURI);

}

}

输出:

Actual URL:http://example.com/foo?key=val-with-a-{-in-it Encoded URL:http%3A%2F%2Fexample.com%2Ffoo%3Fkey%3Dval-with-a-%7B-in-it Encoded URI:http%3A%2F%2Fexample.com%2Ffoo%3Fkey%3Dval-with-a-%7B-in-it

答案 3 :(得分:0)

另一种解决方案是拆分提取的URL,然后使用它们创建所需的URL。这将确保您获得URL类的所有功能。

import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URI;     
import java.net.URISyntaxException;      
import java.net.URL;

public class Sample {

public static void main(String[] args) throws UnsupportedEncodingException,
        URISyntaxException, MalformedURLException {
    String uri1 = "http://example.com/foo?key=val-with-a-{-in-it";

    String scheme=uri1.split(":")[0];

    String authority=uri1.split("//")[1].split("/")[0];

    String path=uri1.split("//")[1].split("/")[1].split("\\?")[0];  

    String query=uri1.split("\\?")[1];  


    URI uri = null;
    uri = new URI(scheme, authority, "/"+path, query,null);

    URL url = null;

    url = uri.toURL();

    System.out.println("URI's Query:"+uri.getQuery());
    System.out.println("URL's Query:"+url.getQuery());

}

}