浅談pageobjectモード

30577 ワード

まず2つのコードを見てみましょう
コード1:
 1 package com.zlshuo.selenium.nonaming.pageobject;

 2 

 3 /**

 4  * @author leshuo

 5  * @version 2014 5 14 

 6  */

 7 public class AT {

 8     

 9     public static void main(String[] args){

10         

11         // 

12         String telephoneNum=BasePage.get("http://shanghai.anjuke.com").

13                 serachKeyWords(" ").clickPorpByindex(1).getTelephoneNum();

14         

15         System.out.println(telephoneNum);

16         

17         // driver

18         BasePage.quit();

19         

20     }

21 }

 
コード2:
 1 package com.zlshuo.selenium.nonaming.pageobject;

 2 

 3 import java.util.ArrayList;

 4 import java.util.List;

 5 import java.util.Set;

 6 import org.openqa.selenium.By;

 7 import org.openqa.selenium.NoSuchWindowException;

 8 import org.openqa.selenium.WebDriver;

 9 import org.openqa.selenium.chrome.ChromeDriver;

10 import org.testng.Assert;

11 

12 /**

13  * @author leshuo

14  * @version 2014 5 14 

15  */

16 public class AT1 {

17     

18     private static WebDriver driver;

19     public static void main(String[] args){

20         

21         System.setProperty ( "webdriver.chrome.driver" , 

22                    "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe" );

23         WebDriver driver = new ChromeDriver();

24         driver.get("http://shanghai.anjuke.com");

25         driver.findElement(By.xpath("//input[@id='glb_search0']")).sendKeys(" ");

26         driver.findElement(By.xpath("//input[@id='glb_search0']")).submit();

27         driver.findElement(By.xpath("//a[@id='prop_name_qt_prop_1']")).click();

28         driver=switchToWindow(2);

29         String telephoneNum=driver.

30                 findElement(By.xpath("//div[@class='A-fangyuan-call']/p[@class='number']")).

31                     getText();

32         System.out.println(telephoneNum);

33         driver.quit();

34     

35     }

36     

37     public static List<String> getWindowHandlesList() {

38         Set<String> handles = driver.getWindowHandles();

39         List<String> list=new ArrayList<String>();

40         for (String s : handles){

41             list.add(s);

42         }

43         return list;

44     }

45     

46     public static WebDriver switchToWindow(int index) {

47         try {  

48             int windowNumber=getWindowHandlesList().size();

49             if(windowNumber<=0){

50                 Assert.fail(" 0");

51             }else if(windowNumber==1)

52                 ;

53             else{  

54                 return driver.switchTo().window(getWindowHandlesList().get(index-1));  

55                 } 

56  

57         } catch (NoSuchWindowException e) {  

58             e.printStackTrace(); 

59         }

60         return driver;  

61         

62     }

63 }

 
この2つのコードが完成した機能は同じです.安住客にアクセスして「上海別荘」を検索し、検索結果の最初の住宅源をクリックし、マネージャーの携帯電話番号を取得します.
コード1は簡潔に見え、pageobjectモードを採用し、単一の用例スクリプトの作成展示に便利であり、コード2は原生のseleniumで書かれ、高い判断を下す.コード1は次のバージョンでもっと分かりやすいです.
 1 package com.zlshuo.selenium.nonaming.pageobject;

 2 

 3 /**

 4  * @author leshuo

 5  * @version 2014 5 14 

 6  */

 7 public class AT {

 8     

 9     public static void main(String[] args){

10         

11         // 

12         AnjukeHomePage homePage=BasePage.get("http://shanghai.anjuke.com");

13         // 

14         AnjukeSaleListPage listPage=homePage.serachKeyWords(" ");

15         // 

16         AnjukeSalePropPage propPage=listPage.clickPorpByindex(1);

17         // 

18         String telephoneNum=propPage.getTelephoneNum();

19         

20         System.out.println(telephoneNum);

21         

22         // driver

23         BasePage.quit();

24         

25     }

26 }

 
まずBasePageを見てみましょう.BasePageはすべてのページの親で、他のページは継承する必要があります.彼は2つの方法getとquitを持っています.getはdriverを初期化しurlにアクセスするために使用され、quitはdriver、killブラウザプロセスを終了するために使用されます.
 1 package com.zlshuo.selenium.nonaming.pageobject;

 2 

 3 import org.openqa.selenium.WebDriver;

 4 import org.openqa.selenium.chrome.ChromeDriver;

 5 

 6 /**

 7  * @author leshuo

 8  * @version 2014 5 14 

 9  */

10 public class BasePage {

11             

12     private static WebDriver driver;

13     

14     public static AnjukeHomePage get(String url){

15         System.setProperty ( "webdriver.chrome.driver" , 

16                    "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe" );

17         driver = new ChromeDriver();

18         driver.get(url);

19         return new AnjukeHomePage(driver);

20     }

21     

22     public static void quit(){

23         driver.quit();

24     }

25     

26 }

 
AnjukeHomePageはBasePageです.get()は、キーワードを検索してリストページに戻るserachKeyWordsメソッドを持つ安住客トップページとして定義されたページオブジェクトを返します.
 1 package com.zlshuo.selenium.nonaming.pageobject;

 2 

 3 import org.openqa.selenium.By;

 4 import org.openqa.selenium.WebDriver;

 5 

 6 /**

 7  * @author leshuo

 8  * @version 2014 5 14 

 9  */

10 public class AnjukeHomePage extends BasePage{

11     

12     private WebDriver driver;

13     

14     AnjukeHomePage(WebDriver driver){

15         this.driver=driver;

16     }

17     

18     public AnjukeSaleListPage serachKeyWords(String words){

19         driver.findElement(By.xpath("//input[@id='glb_search0']")).sendKeys(words);

20         driver.findElement(By.xpath("//input[@id='glb_search0']")).submit();

21         return new AnjukeSaleListPage(driver);

22     }

23     

24 }

 
AnjukeSaleListPageは検索リストページです.このページには検索した関連する部屋のソース情報が表示されています.私は部屋のソースを選択する方法を1つしか書いていません.例として、部屋のソースをクリックすると部屋のソースが表示されるページに入ります.そのためclickPorpByindexは部屋のソースの1ページのオブジェクトAnjukeSalePropPageを返します.
 1 package com.zlshuo.selenium.nonaming.pageobject;

 2 

 3 import java.util.ArrayList;

 4 import java.util.List;

 5 import java.util.Set;

 6 

 7 import org.openqa.selenium.By;

 8 import org.openqa.selenium.NoSuchWindowException;

 9 import org.openqa.selenium.WebDriver;

10 import org.testng.Assert;

11 

12 /**

13  * @author leshuo

14  * @version 2014 5 14 

15  */

16 public class AnjukeSaleListPage extends BasePage{

17     

18     private WebDriver driver;

19     

20     public AnjukeSaleListPage(WebDriver driver){

21         this.driver=driver;

22     }

23     

24     public AnjukeSalePropPage clickPorpByindex(int index){

25         driver.findElement(By.xpath("//a[@id='prop_name_qt_prop_"+index+"']")).click();

26         // 

27         driver=switchToWindow(2);

28         return new AnjukeSalePropPage(driver);

29     }

30     

31     private List<String> getWindowHandlesList() {

32         Set<String> handles = driver.getWindowHandles();

33         List<String> list=new ArrayList<String>();

34         for (String s : handles){

35             list.add(s);

36         }

37         return list;

38     }

39     

40     private WebDriver switchToWindow(int index) {

41         try {  

42             int windowNumber=getWindowHandlesList().size();

43             if(windowNumber<=0){

44                 Assert.fail(" 0");

45             }else if(windowNumber==1)

46                 ;

47             else{  

48                 return driver.switchTo().window(getWindowHandlesList().get(index-1));  

49                 } 

50  

51         } catch (NoSuchWindowException e) {  

52             e.printStackTrace(); 

53         }

54         return driver;  

55         

56     }

57 }

 
AnjukeSalePropPageマネージャーの電話を取得するには1つの方法しかありません
 1 package com.zlshuo.selenium.nonaming.pageobject;

 2 

 3 import org.openqa.selenium.By;

 4 import org.openqa.selenium.WebDriver;

 5 

 6 /**

 7  * @author leshuo

 8  * @version 2014 5 14 

 9  */

10 public class AnjukeSalePropPage extends BasePage{

11     

12     private WebDriver driver;

13     

14     public AnjukeSalePropPage(WebDriver driver){

15         this.driver=driver;

16     }

17     

18     public String getTelephoneNum(){

19         return driver.findElement(By.xpath("//div[@class='A-fangyuan-call']/p[@class='number']")).

20                 getText();

21     }

22 }

 
pageobjectモードは、ビジネスロジック上の各ステップの操作を区別点とし、ページメソッドがこのページのビジネス操作を表し、この操作の後続のプロセスを厳格に制御するメリットは、以下の点にあります.
1.ページ単位で、重複する操作は一つの方法にカプセル化され、ページ要素やプロセスが変動する場合、関連するページ方法を修正するだけで、対応するスクリプト2を修正する必要はない.テストスクリプトの作成は簡単で、ビジネスロジックに沿ってスクリプトを書くのは手作業でテストするのと同じ感じです.例えば、安居客のトップページを訪問する->上海の別荘を検索する->検索結果の最初の住宅源をクリックして住宅源の単ページに入る->マネージャーの携帯電話番号を取得し、脚本を書くとBasePageである.get("http://shanghai.anjuke.com").serachKeyWords("上海別荘").clickPorpByindex(1).getTelephoneNum().一気呵成.3.PageFactoryモードと併用して前期開発コストを節約
もちろん、これらの奇淫巧計はすべて錦に花を添えるものであり、本当の着地点はプロセスを規範化し、開発者の個人レベルを高めることである.
先に汚染してから管理する理念は捨てなければならない.