ScreenshotArgumentを使用したスクリーンショットの取得
ScreenshotArgument、ScreenshotArgumentBuilderの用例
ScreenshotArgument及びScreenshotArgumentBuilderを使用したスクリーンショットの取得コードをいくつか示します。ScreenshotArgumentBuilderがどのようなメソッドを有しているかはこちらを参照してください。
(※ScreenshotArgument、ScreenshotArgumentBuilderは1.0.1で追加予定です。)
BODYだけを撮影する
CompareTargetを直接利用する時にBODYタグを撮影する場合は、 "new CompareTarget()" と特に対象を指定する必要はありません。
ScreenshotArgumentBuilderを利用する場合もこれと同様に対象を指定する必要はありません。 "addNewTarget" の引数無しを呼び出して下さい。
/**
* BODYをScreenshotArgumentを使用せずに撮影する場合
*/
@Test
public void doNotUse_ScreenshotArgument() throws Exception {
driver.get(null);
assertionView.assertView("sample01", new CompareTarget[] {new CompareTarget()});
}
/**
* BODYをScreenshotArgumentを使用して撮影する場合
*/
@Test
public void use_ScreenshotArgument() throws Exception {
driver.get(null);
ScreenshotArgument arg = ScreenshotArgument.builder("sample01")
// 撮影対象を指定
.addNewTarget()
.build();
assertionView.assertView(arg);
}
}
IDを指定してスクリーンショットを取得し、更に除外条件を追加する
CompareTargetを直接利用する場合でかつ除外条件を設定する場合、対象を指定するScreenAreaの配列を作成し、 "new CompareTarget(target: ScreenArea, excludes: ScreenArea[], moveTarget: boolean)" を呼ぶ必要があります。
ScreenshotArgumentBuilderではこれを大幅に簡易化し、ターゲットとなる要素を "addNewTarget" で指定した後に "addExclude" を呼び出すことで除外条件を指定することができます。またaddExcludeを複数回呼び出すことで複数の除外条件を指定することも可能です。
/**
* idを指定して要素を撮影し、CSSセレクタやCSSクラス名で除外条件を指定して
* ScreenshotArgumentを使用しないでスクリーンショットを取得する
*/
@Test
public void doNotUse_ScreenshotArgument() throws Exception {
driver.get(null);
// 除外条件を生成
ScreenArea[] excludes = {
ScreenArea.of(SelectorType.CSS_SELECTOR, "div.exclude"),
ScreenArea.of(SelectorType.CLASS_NAME, "excludeClass")
};
// スクリーンショットの撮影情報を生成
CompareTarget target = new CompareTarget(ScreenArea.of(SelectorType.ID, "targetId"), excludes, true);
assertionView.assertView("sample02", new CompareTarget[] {target});
}
/**
* idを指定して要素を撮影し、CSSセレクタやCSSクラス名で除外条件を指定して
* ScreenshotArgumentを使用してスクリーンショットを取得する
*/
@Test
public void use_ScreenshotArgument() throws Exception {
driver.get(null);
ScreenshotArgument arg = ScreenshotArgument.builder("sample02")
// 撮影対象を指定
.addNewTargetById("targetId")
// 複数の除外条件を追加
.addExcludeByCssSelector("div.exclude")
.addExcludeByClassName("excludeClass")
.build();
assertionView.assertView(arg);
}
}
複雑な撮影条件を指定する
一回の撮影で動的な要素を非表示にしつつ複数の対象を撮影する、の様な複雑な条件でスクリーンショットを取得する場合があります。CompareTargetの直接利用は下記の様に必要なコードが増えてしまい見通しがあまりよくありません。
ScreenshotArgumentBuilderを利用してシンプルに記述することで可読性が大幅に向上します。
"addExclude"や"moveTarget"メソッドは最後に呼んだ"addNewTarget"の対象にのみ効果があります。 複数の撮影対象を指定する場合はそれぞれの対象に対して指定して下さい。
/**
* 複数の撮影対象や除外条件、非表示条件を指定して
* ScreenshotArgumentを使用しないでスクリーンショットを取得する
*/
@Test
public void doNotUse_ScreenshotArgument() throws Exception {
driver.get(null);
// 撮影条件1の除外条件を生成
ScreenArea[] excludes1 = {
ScreenArea.of(SelectorType.CSS_SELECTOR, "div.exclude"),
ScreenArea.of(SelectorType.CLASS_NAME, "excludeClass")
};
// 撮影条件1を生成
CompareTarget target1 = new CompareTarget(
ScreenArea.of(SelectorType.ID, "targetId"), excludes1, true);
// 撮影条件2の除外条件を生成
ScreenArea[] excludes2 = {
ScreenArea.of(SelectorType.CSS_SELECTOR, "div.autoMove")
};
// 撮影条件2を、撮影時に要素を移動しない様に指定して生成
CompareTarget target2 = new CompareTarget(
ScreenArea.of(SelectorType.CLASS_NAME, "targetClass"), excludes2, false);
// 非表示とする要素の条件を生成
DomSelector[] hiddenElementSelectors = {
new DomSelector(SelectorType.TAG_NAME, "header"),
new DomSelector(SelectorType.ID, "goBack")
};
assertionView.assertView("sample03", new CompareTarget[] {target1, target2}, hiddenElementSelectors);
}
/**
* 複数の撮影対象や除外条件、非表示条件を指定して
* ScreenshotArgumentを使用してスクリーンショットを取得する
*/
@Test
public void use_ScreenshotArgument() throws Exception {
driver.get(null);
ScreenshotArgument arg = ScreenshotArgument.builder("sample03")
// 撮影対象1を指定
.addNewTargetById("targetId")
// 撮影条件1の除外条件を指定
.addExcludeByCssSelector("div.exclude")
.addExcludeByClassName("excludeClass")
// 撮影対象2を指定
.addNewTargetByClassName("targetClass")
// 撮影条件2の除外条件を指定
.addExcludeByCssSelector("div.autoMove")
// 撮影条件2は撮影時に要素を移動しない様に指定
.moveTarget(false)
// 非表示とする要素の条件を指定
.addHiddenElementsByTagName("header")
.addHiddenElementsById("goBack")
.build();
assertionView.assertView(arg);
}
}
スクリーンショットIDを変更する
複数回スクリーンショットを取得する際に、以前利用した撮影条件をそのまま利用するパターンが考えられます。
ScreenshotArgumentはイミュータブルオブジェクトでありスクリーンショットIDを変更することはできませんが、 "withScreenshotId" メソッドを呼び出すと指定したIDを持つ新たなScreenshotArgumentオブジェクトを取得することができます。
@Test
public void use_ScreenshotArgument() throws Exception {
driver.get(null);
ScreenshotArgument arg = ScreenshotArgument.builder("sample04")
.addNewTargetById("targetId")
.addExcludeByCssSelector("div.exclude")
.addExcludeByClassName("excludeClass")
.build();
// 一回目のスクリーンショット取得
assertionView.assertView(arg);
// スクリーンショットIDを変更して、同じ条件で二回目のスクリーンショット取得
assertionView.assertView(arg.withScreenshotId("sample05"));
}
}