我正在使用 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"))
}
但这似乎是肮脏和错误的。
我想我的问题是多部分的:
- 为什么 FirefoxDriver 返回一个字符串而不是一个 URI?
- 为什么这个字符串格式错误?
- 处理这种事情的最佳做法是什么?