SeleniumのPageFactory&PageObjectの大規模プロジェクトへの応用


道の出口は、外に出たら、いつも道がある.困難と苦難は,家に閉じ込めるのは難しい.
最近出会った技术の问题はずっと実行可能な解决方法を探し当てていないため、ずっとseleniumのソースコードをめくって、前にテストコードを书く时持ってきてすぐ使って、どんな机能を书いて、手动の操作のステップによって変换して、最近1つの文章を见て、またwikiの上で调べて、书くのが悪くないと思って记录しました.
seleniumを使用してUIテストを行う場合、ページのすべての機能をテストするわけではありません.常に回帰する機能があります.もっと細かく言えば、いくつかのノードは私たちがよく操作しています.では、プロジェクトの初期から自動化テストコードの作成を行うと、プロジェクトに適応する自動化テストコード構造を設計することができます.基本的な考え方は、ページごとに対応するPageObjectクラスを作成することです.共通のテンプレートページであれば、もちろん1つだけ作成すればいいのです.このようにして、多くの基礎ページを構築するのと同じように、プロジェクト開発の過程で完全なドキュメントや十分な詳細なユーザーストーリがあれば、完璧すぎます~~これによって、IDE----Browser間の切り替え、検索、テスト作業を何度も減らすことができ、本当に便利です.しかし、これはプロジェクト次第でしょう.このような細かいドキュメントは多くのチームができなかったようです.しかし、筆者は本当に製品の初期やプロジェクトの開始時に、これらの自動化テストのスタッフに完全なドキュメントを提供することを望んでいます.これにより、自動化テストコードの作成を大幅に加速することができます.ちょっと遠回りしました...本題に戻って、このようなページと基礎クラスの実現をどのようにしますか?最も現実的なのは、コードを見てください.
public class PageObject {

	private WebElement searchTypeSng;
	private WebElement fromCity;
	private WebElement toCity;
	private WebElement fromDate;

	public String calDate(int nextDays) {
		//   n   
		Date date = DateUtils.addDays(new Date(), nextDays);
		//  
		return DateFormatUtils.ISO_DATE_FORMAT.format(date);
	}

	public void searchTrip(WebDriver driver,String from, String to ,String date) {
		BaseUtils.clearAndTypeString(driver,fromCity, from);
		BaseUtils.clearAndTypeString(driver,toCity, to);
		BaseUtils.clearAndTypeString(driver,fromDate, date);
		searchTypeSng.submit();
	}

}

テストの実行:
public class UsingPageObject {

	public static void main(String[] args) {

		WebDriver driver = new FirefoxDriver();

		EventFiringWebDriver eventDriver = new EventFiringWebDriver(driver);
		
		eventDriver.register(new MyWebDriverListener());
		
		eventDriver.get("http://flight.qunar.com/");
		
		PageObject object = PageFactory.initElements(driver, PageObject.class);
		
		String date = object.calDate(30);
		
		object.searchTrip(driver," ", " ", date);
		

	}
}
はこの時点で検索という機能に対する発煙テストを完了し、テスト実行コードはTestNGを使用せず、main関数を直接使用しただけだ.ブログを簡単に書くためには、真似はお勧めしません.
他の機能をテストし、他のノードを使用する必要がある場合は、PageObjectクラスに適切なFieldを直接追加します.
分割線------------------------------------------------------------------------------------------------------------分割線
ここまで書くと、この方法を使ったことがない人は見れば見るほどめまいがします.今、その実行原理を簡単に説明します.
PageObjectクラスで作成したFieldの名前はページと一定の対応関係があり、勝手に取ったものではありません.上のコードのように書けば、デフォルトのseleniumはIdに基づいて最初に要素検索を行います.検索されていなければnameで検索します.下の私は言いません.あなたが考えているからです.のページの非規範性や複雑さが高く、ID、name、Cssなどの衝突が発生しやすく、seleniumが要素を正確に認識できないのではないかと心配している場合は、下を見てください.
seleniumはまた、コードを直接接続するか、注釈を提供します.
public class PageObject {
	private WebElement searchTypeSng;
	@FindBy(name="fromCity")
	private WebElement fromCity;
	@FindBy(name="toCity")
	private WebElement toWhere;
	private WebElement fromDate;

	public String calDate(int nextDays) {
		//   n   n=30
		Date date = DateUtils.addDays(new Date(), nextDays);
		//  
		return DateFormatUtils.ISO_DATE_FORMAT.format(date);
	}

	public void searchTrip(WebDriver driver,String from, String to ,String date) {
		BaseUtils.clearAndTypeString(driver,fromCity, from);
		BaseUtils.clearAndTypeString(driver,toWhere, to);
		BaseUtils.clearAndTypeString(driver,fromDate, date);
		searchTypeSng.submit();
	}

}

この2つのannotationsを見たとき、seleniumは注釈を提供してページの要素を正確に位置決めし、参考にできるキーワードはclassName、css、id、linkText、name、partialLink Text、tagName、xpathです.
またseleniumでは2つのキーワードが提供されています.1つはhowで、もう1つはusingで、どのように使うかはここに書かれていません.筆者は、この2つのキーワードを使うのがもっと面倒で、理解するのも面倒だと思っています.
PageObject&PageFactoryの使用については、簡単にこんなにたくさん書いていますが、PageFactoryについてはまだたくさんの知識がありますので、時間を割いて次の文章に書きます.このパターンを使っている友達がいたら、批判と指摘をして、お互いに討論して勉強してください.