私は、Selenium 2 と FireFox ドライバーを使用した (Java/Groovy) ブラウザー自動化アプリの作成に携わっています。
現在、明らかに不正なURI 構文を使用していることが確認された一部の URL に問題があります。(具体的には中括弧 ( {}
)、|
's、および^
's)。
String url = driver.getCurrentUrl(); // http://example.com/foo?key=val|with^bad{char}acters
java.net.URI
aによって返された文字列からa を構築しようとすると、 driver.getCurrentUrl()
aURISyntaxException
がスローされます。
new URI(url); // java.net.URISyntaxException: Illegal character in query at index ...
url
を構築する前に全体をエンコードURI
しても機能しません(私が理解しているように)。
URL全体がエンコードされており、通常の方法で解析できる部分は保持されません. たとえば、この uri-safe 文字列では、クエリ文字列パラメーターの区切り文字としてのa と、単一の qs-param のコンテンツ内の (そのエンコードされた値) URI
の違いを認識できません。&
%26
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
、次の (グルーヴィーな) コードを実行することです。
["|", "^", "{", "}"].each {
url = url.replace(it, URLEncoder.encode(it, "UTF-8"))
}
しかし、これは汚くて間違っているようです。
私の質問はマルチパートだと思います:
- FirefoxDriver が URI ではなく文字列を返すのはなぜですか?
- この文字列の形式が正しくないのはなぜですか?
- この種のことに対処するためのベストプラクティスは何ですか?