3

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

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

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

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

new URI(url); // java.net.URISyntaxException: Illegal character in query at index ...

url在构建之前对整体进行编码URI将不起作用(据我所知)。

整个url 是编码的,它不会保留我可以以任何正常方式解析的任何部分例如,使用这个 uri-safe 字符串,URI无法知道&作为查询字符串参数分隔符%26的 a 或单个 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 返回一个字符串而不是一个 URI?
  2. 为什么这个字符串格式错误?
  3. 处理这种事情的最佳做法是什么?
4

4 回答 4

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
于 2015-04-08T17:46:58.233 回答
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

于 2015-04-09T13:25:33.200 回答
0

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

有关 Java中的示例,请参阅查询字符串参数的 Java URL 编码。

于 2015-03-12T18:25:54.640 回答
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());

}

}
于 2015-04-10T09:08:01.663 回答