selenium(selenideもおなじ) の webdriver から cookie をとって okhttp の client に差し込む
型が違うので受け渡してやる必要あった。もっとうまくやれそうだがあきらめた。
以下は、url を download する例
private void downloadFileSync(final String downloadUrl, String orgFilename) throws Exception {
List<Cookie> cookies = new ArrayList();
String domain = "example.com";// . で始まるドメインだと例外になるので k.getDomain() でとったあと . をとるか、直接指定する
val cc = new Cookie.Builder();
for (org.openqa.selenium.Cookie k : getWebDriver().manage().getCookies()) {
cc.domain(domain).name(k.getName()).path(k.getPath()).value(k.getValue());
if (k.isSecure()) { cc.secure(); }
if (k.isHttpOnly()) { cc.httpOnly(); }
if (k.getExpiry() != null) { cc.expiresAt(k.getExpiry().getTime()); }
cookies.add(cc.build());
}
CookieManager cookieManager = new CookieManager(null, ACCEPT_ALL);
CookieHandler.setDefault(cookieManager);
JavaNetCookieJar cookieJar = new JavaNetCookieJar(cookieManager);
cookieJar.saveFromResponse(HttpUrl.parse(downloadUrl), cookies);
OkHttpClient client = new OkHttpClient().newBuilder().cookieJar(cookieJar).build();
String filename = orgFilename + ".jpg";
log.info("download filename : {}", filename);
Request request = new Request.Builder().url(downloadUrl).build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) {
throw new IOException("Failed to download file: " + response);
}
FileOutputStream fos = new FileOutputStream("/tmp/" + filename);
fos.write(response.body().bytes());
fos.close();
}
ChromeDriver では get(url) で、画像ファイルなどを取得する方法がみつからなかったので、上記のように url を okhttp に渡して、cookie との整合性も用意してやるようにしました。
あるいは
String[] cookieKeys = { "hoge", "hogehoge", "hogehogehoge" };
StringBuilder cookie = new StringBuilder();
for (String key : cookieKeys) {
val oneCookie = getWebDriver().manage().getCookieNamed(key);
cookie.append(String.format("%s=%s;", key, oneCookie.getValue()));
}
OkHttpClient client = new OkHttpClient().newBuilder().build();
Request request = new Request.Builder().url(downloadUrl).header("Cookie", cookie.toString()).build();
Response response = client.newCall(request).execute();
こんなで header にいれてやるだけでも良かった。
getWebDriver().manage().getCookie()
が、String でまるっととれればいいんだが。できるのかな?
over.