この 1 年間、私は自分のグループのために非常に優れた WebDriver フレームワークを構築しました。かなり標準的な運賃: 通常、ページ クラスは、プラットフォーム上のページの全機能をカプセル化します (By オブジェクトとしてのコントロール、必要に応じてメソッド) & いくつかのグローバル メソッドで基本クラスを拡張します。JUnit テスト クラス内で複数のページが呼び出され、典型的なアサーション メソッドです。 、ヤダヤダ。本のように贅沢なことは何もありませんが、非常に機能的で柔軟です。
しかし最近、フレームワークを使用して、100 以上の入力、選択、オプションなどを保持できるフォームを含む多数のページを自動化するよう依頼されました。さらに、多くのカスタム フォーム コントロールの id は環境ごとに変化します (幸いなことに、最初のプッシュの後、それらは環境ごとに静的なままです)。ともかく...
私が毎日使用する典型的な PageObject 構造を見てみましょう。
/** Constructor*/
public someConstructor(WebDriver driver){
super(driver, pageTitle);
}
/**Locators*/
By searchBoxLocator = By.id("phSearchInput");
By searchBoxClearLocator = By.id("phSearchClearButton");
By searchButtonLocator = By.cssSelector("input[value='Search']");
/**Some Methods*/
public void selectFromTabBar(String tabName){
driver.findElement(By.linkText(tabName)).click();
}
public static void enterInputValue(WebDriver driver, By by, String val){
List<WebElement> elements = null;
elements = driver.findElements(by);
if(!elements.isEmpty()){
driver.findElement(by)).sendKeys(val);
}else{
throw new NoSuchElementException("Message");
}
}
私が言ったように、ここで風変わりなことは何もありませんが、ここで皆さんへの私の質問です。PageObject ごとに従来の 5 ~ 15 By ではなく、10 の Pages に対して 100 を超える可能性がある状況を考えてみましょう。また、環境ごとに独自の値を持つことになるという複雑な問題を投げかけますが、これは完全に誰の手にも負えず、調整することはできません。それで、ここで適切なアプローチは何ですか...私は箇条書きを噛んでページごとに100インチのByをハードコードしますか、すべてのByをたとえばExcelドキュメントに外部化し、JXLなどを介してすべてをプルしますか、または静的であることがわかっているByをハードコーディングして、すべてを外部ファイルにスローしますか?
結局のところ、正解がないことはわかっていますが、他の人がこれにアプローチすることに興味があります。現在、非常に多くのフォーム要素を持ち、PageObject 内で変更されないコントロールを定義するページの By を外部化しましたが、扱いにくいと感じています。エレガンスを求めすぎているのかもしれませんが、どんな考えでも本当に素晴らしいと思います。