2016-09-27 105 views
0

使用POM構建硒框架並嘗試爲重複使用的功能(如設置文本,獲取文本,設置單選按鈕,列表框等)添加常用操作類,如下所示的結構使用POM構建硒框架並需要專家的建議

測試 - > POM頁面對象

POM頁面對象 - >普通的動作類

@Test 
public void verifyGooglebuttontext() { 
    System.out.println("set search value"); 
      googlepage.setSearchValue("Google Test"); 
    Assert.assertEquals(addC.verifytext(),"Google"); 
} 

POM

@FindBy(name="q") 
WebElement txtGoogleSearch; 

public static setSearchValue(String txt) { 
     setText(txtGoogleSearch, txt) 
} 

共同行動類

public void setText(WebElement element,String Value){ 
     element.sendKeys(Value); 
} 

我查詢這是否會影響性能,因爲我有打電話給兩個功能,而不是設置,直接在頁面對象類得到控制值。

請指教。

+0

爲什麼你需要通用操作類? – Amol

+1

有時喜歡選擇多個下拉列表和選擇單選按鈕或列表框我不需要在每個頁面對象類上重複編寫相同的一組代碼。減少代碼冗餘。 – Leo

+0

當你說POM時,我假設POM =頁面對象模型而不是Maven POM。清晰度可以幫助他人幫助你。 – robx

回答

0

鑑於大多數時候您會等待頁面加載並搜索加載頁面的DOM中的元素,我不會過多擔心兩個額外的函數調用。

真的,與方法調用(微秒或更少)相比,頁面加載將需要很長時間(>毫秒)。

你從中獲得的效果會更好:如果用戶界面發生變化,你將不得不重新訪問一小部分位置以適應新的元素位置/類型/方式來執行一個動作(而@Test邏輯可以保持幾乎不變)。這意味着您可以在幾個小時內完成運行,而不是幾天之內完成代碼並查找/更改受用戶界面更改影響的所有場所。

0

在這種情況下,您並未減少冗餘,您正在添加它。您正在執行一個班輪driver.findElement(...).sendKeys(value)並將其更改爲不同的班輪setText(driver.findElement(...), value),但創建了附加功能setText()。這裏沒有必要再增加一層複雜性。它不會在這裏或維護過程中節省時間。

@FindBy(name="q") 
WebElement txtGoogleSearch; 
public static setSearchValue(String txt) { 
    txtGoogleSearch.sendKeys(txt); 
} 

我不會使用PageFactory。如果您測試任何複雜的網站,您會發現自己在初始加載後在頁面上重新提取元素。爲了避免這種情況,定義您的定位器是頁面對象的一部分,並在需要時使用它們來獲取元素。

示例頁面對象

public class AutomationPracticeTablePage 
{ 
    private WebDriver driver; 
    private By pageTitleLocator = By.xpath("//h1[text()='Automation Practice Table' and @class='h1-size']"); 
    private By tableHeadingLocator = By.cssSelector("table > thead th"); 

    public AutomationPracticeTablePage(WebDriver webDriver) throws IllegalStateException 
    { 
     this.driver = webDriver; 

     // wait for page to finish loading 
     new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(pageTitleLocator)); 

     // see if we're on the right page 
     if (!driver.getCurrentUrl().contains("/automation-practice-table/")) 
     { 
      throw new IllegalStateException("This is not the Automation Practice Table page. Current URL: " + driver.getCurrentUrl()); 
     } 
    } 

    public List<String> getHeadings() 
    { 
     List<String> headings = new ArrayList<String>(); 
     for (WebElement heading : driver.findElements(tableHeadingLocator)) 
     { 
      headings.add(heading.getText()); 
     } 

     return headings; 
    } 
} 

示例代碼使用頁面對象

driver.get("http://toolsqa.com/automation-practice-table/"); 
AutomationPracticeTablePage automationPracticeTablePage = new AutomationPracticeTablePage(driver); 
System.out.println(automationPracticeTablePage.getHeadings()); 
+0

我可以說有setText(element,text)這樣的函數是有用的。但是,這不是在這裏實施。如果在新功能中有額外的支持,它會很有用。即:輸入字段被改寫dom的javascript覆蓋,好吧,我們可以通過輪詢classname,id等來添加對等待javascript的支持,以在嘗試插入文本之前出現。等待輸入字段不能只讀... 在這一切都是一個很好的答案 – robx

+0

@robx同意。我並不是說某種「幫手功能」從來沒有用......但只有當它有足夠的肉來證明它的存在時。我從來沒有理解圍繞一個班輪寫封皮,但我在這裏和其他地方看過幾次。 – JeffC

0

我會勸你不縮寫頁面對象模型POM啓動。 POM作爲項目依賴管理文件與Maven相關聯。同時也讓你的問題更加清晰。您越清晰簡潔,您將獲得更好更快的支持。您可以訪問http://toolsqa.com/以更好地理解頁面對象模型結構,獲得創意並改進您的術語。

這是一個@Test腳本(方法),而不是一個類。它也不是一個頁面對象模型。任何用此註解的方法都被認爲是要執行的測試腳本。

@Test 
public void verifyGooglebuttontext() { 
    System.out.println("set search value"); 
      googlepage.setSearchValue("Google Test"); 
    Assert.assertEquals(addC.verifytext(),"Google"); 
} 

這是一個WebElement和一個頁面對象內的函數方法。不是頁面對象模型

@FindBy(name="q") 
WebElement txtGoogleSearch; 

public static setSearchValue(String txt) { 
     setText(txtGoogleSearch, txt) 
} 

這不是一個類。這是一堂課的方法。

public void setText(WebElement element,String Value){ 
     element.sendKeys(Value); 
} 

好吧,現在,您的setText(WebElement,String)方法太薄弱,無法提供任何值。但是,如果您覺得有必要,可以在方法中添加其他支持。我的大多數經驗並不需要額外的輸入字段支持,但我遇到了一些需要額外支持javascript的情況;頁面加載後的DOM操作。

這裏的觀點和建議是,不要過於複雜,沒有必要。使用當前的工作,並隨時調整支持。現在,如果您可以進一步瞭解項目的前景,那麼您將需要此類支持,請繼續努力,並提前實施支持。