Selenideで全画面のキャプチャを取る

Seleniumを使ったテストの記述を楽にしてくれるSelenideを使ってみました。

selenide.org

スクリーンショットも簡単に取ることができます。

Selenide.screenshot("toppage");

これだけで、画像とhtmlソースがbuild/reports/tests/ フォルダに toppage.png, toppage.htmlとして保存してくれます。

課題

これで取った画像サイズが、Windowサイズになってしまいます。デフォルトでは「1366x768」。
実行時であれば、

Configuration.browserSize = "1366x1200";

でWindowサイズを変更できるのですが、対象の画面によって縦サイズは変わるので予め決めておくのは現実的ではありません。
ブラウザのWindowを動的に変えれればいいのですがどうやればいいのでしょうか。

対策

思いつくのは、表示された後、対象の画面のbodyのサイズを取得し、Windowサイズを変更すればよいというものです。

画面サイズを取る

WebDriverの機能にそのままのものがありません。
JavaScriptであれば取得できるので、JavaScriptを実行してその結果を取れればいいと思います。 Selenide.executeJavaScriptメソッドでJavaScriptを実行し、その結果を取得します。

int width = ((Number) Selenide.executeJavaScript("return document.body.clientWidth")).intValue();
int height = ((Number) Selenide.executeJavaScript("return document.body.clientHeight")).intValue();
System.out.println(width + "x" + height);

Windowサイズを変更する

こちらは、設定する場所を見つけるのが面倒でしたが、WebDriverのメソッドで可能です。

WebDriverRunner.getWebDriver().manage().window().setSize(new Dimension(width, height));

まとめ

単純に画面にアクセスし、全画面キャプチャを取得するコードはこうなります。

Configuration.browser = Browsers.CHROME;
Configuration.headless = true;

Selenide.open("http://www.yahoo.co.jp/");

int width = ((Number) Selenide.executeJavaScript("return document.body.clientWidth")).intValue();
int height = ((Number) Selenide.executeJavaScript("return document.body.clientHeight")).intValue();
WebDriverRunner.getWebDriver().manage().window().setSize(new Dimension(width, height));

Selenide.screenshot("yahoo");

これで、テストなどを行う基本的な準備が出来たかなと思います。