2011-11-03 56 views
22

在建模頁面對象時,如何處理具有窗體和大約50個輸入字段的頁面?這裏最好的做法是什麼?Selenium中的頁面對象模型最佳實踐

你會創建一個頁面對象併爲每個輸入操作寫一個單獨的函數嗎?或者你會寫一個函數的參數傳遞給它並輸入文本?

例如

public void enterFirstName(String firstName) { 
    driver.type("firstNameField", firstName); 
} 

public void enterSecondName(String secondName) { 
    driver.type("secondNameField", secondName); 
} 

public void fillInForm(String inputFieldName, String text) { 
    driver.type(inputFieldName, text); 
} 

我可以在第一模型中看到,編寫測試時,測試是更具描述性的,但如果頁面包含了太多的輸入字段,創建頁面對象變得麻煩。

這篇文章也是在頁面構建Selenium測試挺有意思的對象 Functional Automated Testing Best Practices with Selenium WebDriver

+0

看看[我的stackoverflow問題](http://stackoverflow.com/questions/8149808/whats-the-best-way-to-use-selenium-pageobject-design-pattern)爲例如何我將要使用頁面對象設計模式。 我不是100%的自己,但從很多閱讀,我敢肯定我的正確路線,希望我粘貼幫助你。 –

+0

http://selenium-tutorial.blogspot.com/2012/06/webdriver-page-objects-pattern.html –

+1

您可以將所有類似的WebElement類型放入列表中。所以,如果您有40個文本字段可以從列表中逐一繪製,請獲取「名稱」或「ID」以標識它,然後對其進行操作。 – djangofan

回答

9

我總是喜歡把任務分配的相關信息組。例如,如果我有一個用戶類,我可能會將它分解爲幾個較小的類:LoginCredentials,ProfileInfo,Settings等,但我仍然通常擁有包含這些子類的頂級用戶類。

我肯定會推薦的一件事是將對象傳遞給一個FillForm函數,而不是所有這些單獨的函數。使用這種方法有很多優點。一個,你可以有一些用於許多測試用例的「通用」預配置對象。例如:

public class FormInfo 
{ 
    string Domain; 
    string Name; 
    string Category; 
    // etc... 

    public FormInfo(string domain, string name, string category) 
    { 
    Domain = domain; 
    Name = name; 
    Category = category; 
    // etc... 
    } 
} 


// Somewhere in your initialization code 
public static FormInfo Info1 = new FormInfo("myDomain1", "myName1", "myCategory1"); 
public static FormInfo Info2 = new FormInfo("myDomain2", "myName2", "myCategory2"); 

You can still update one of your common merchants if you need to do something one-off: 

// In your test case: 
Info1.Category = "blah"; 
FormPage.FillForm(Info1); 

或者,您可以根據需要爲特定測試用例創建一個全新的商戶對象。你也可以做這樣的事情字段驗證或者使用這些對象,或者我通常做的是打破特定字段驗證的頁面對象模式,所以如果我驗證商家域場我可以這樣做:

Info1.Domain = null; //This should make the FillForm function skip doing anything with this field. 
FormPage.FillForm(Info1); 
FormPage.DomainTextBox.Text = "field validation string"; 

這種方法的另一個重要優點是,如果頁面被更新以添加,刪除或修改字段,則只需要更新FormInfo對象和FillForm函數,並且不需要修改調用FillForm函數的特定測試用例 - 假設他們正在使用您的一個常見的FormInfo對象。獲得更多覆蓋的另一種可能性是設置一個常用的FormInfo對象,以便爲每個符合最小/最大長度的字段生成隨機字符串,並在所有不同的允許字符之間循環。這允許你從同一組測試中獲得一些額外的測試,但是如果你只從特定的字符串開始獲得失敗結果,它也會增加一些噪音,所以要小心。

9

的頁面對象模型背後的想法是,它抽象的實現從調用者了。在第一種機制中,你成功地這樣做了,因爲調用者不需要知道html輸入字段名稱是否從「firstName」更改爲「user_first_name」,而在第二個實現中,對實際頁面的任何更改都必須是流傳給你的頁面對象的所有調用者。

儘管在創建頁面對象時可能需要更多的工作,但如果您維護封裝,那麼當真正的HTML頁面不可避免地發生變化時,它將長期保存工作。

+0

謝謝digitalJoel, 如何創建在頁面頂部定義了公共定位器變量(how)的頁面,然後在我的Test類中,我實例化該頁面,並將定位器變量傳遞給通用fillInform。從這個意義上講,我的變量仍然位於一個位置,頁面對象和我所有的測試都會引用這些變量,所以當它們發生變化時,我仍然需要維護一個位置。 –

+0

這將是一種方法。具有公共靜態最終字段的名稱,然後提供一種方法。直到你需要爲一個值做一些特殊的處理,然後你有一個單獨的方法來處理'myPage.setSpecialValue(blah)'和其他你有'myPage.fillInForm(MyPage.MY_NAME,blah)'的東西,它是不一致,但這可能是一個橋樑,你可以跨越/如果你來到它,而不是現在建立它。隨你便。 – digitaljoel

+2

最好的「謝謝」是投票回答一些問題。在你的問題的14個答案中,你只有最多4個答案,並且沒有接受任何答案。我不是在談論我的答案,但是任何你認爲有用的答案(比如山姆伍茲關於這個問題的答案)都可以/應該被提高。 – digitaljoel

0

我在表單中這樣做的方式是獲取頁面上所有輸入的列表。然後刪除任何未顯示的輸入元素。之後,我可以將有效或無效的文本輸入到每個輸入中。從那裏我收到驗證總結,以確保我得到正確的錯誤或不。如果沒有,則記錄異常。

這樣做的作用是允許我將文本輸入到頁面上的儘可能多的輸入,它仍然允許我記錄異常並通過電子郵件發送它們。我也在我的列表中捕獲textareas和密碼字段,並且我有一個單獨的複選框字段和選項列表,因爲我通常需要對這些字段進行不同的操作。

什麼它歸結爲是我必須做的測試頁面是這樣的:

for (int i = 0; i < inputs.Count(); i++) 
{ 
    //This captures the error message string created in the input validation method 
    //nextButton is the IWebElement of the button to click to submit the form for validation 
    //ErrorMessageID is the ID of the Validation Summary display box (i.e. ErrorMessageID = "FormSummary" <asp:ValidationSummary ID="FormSummary" runat="server" CssClass="errorMessage" /> 

    string InputValidationText = utilities.InputValidation(driver, inputs, i, nextButton, ErrorMessageID) 
    if(InputValidationText != string.Empty) 
    { 
    //LogError 
    } 
} 
1

除了你enterWhatever()方法,我平時也創造一個createWhatever(field1, field2, ...)方法,我可以作爲一個快速路徑來創建任何形式建立,使用時測試的真正目的是別的東西使用。因此,如果我需要創建一個客戶來測試提交工單,那麼測試將轉到CreateACustomer頁面,並調用createCustomer(firstName, lastName, emailAddress, ...),然後繼續進行使用該客戶創建工單的更細微的任務。

1

我回答讀者的利益的老問題。

除了這裏的其他好的答案,我想在這裏爲那些剛接觸POM的人添加一些建議。

頁面對象是衆所周知的設計模式,被自動化工程師廣泛接受,爲應用程序的每個頁面創建單獨的類文件,以將所有元素作爲屬性及其行爲/業務功能作爲類的方法進行分組。但是在爲頁面創建類時幾乎沒有問題 - 尤其是當頁面具有更多/不同的元素集合/複雜元素(如網格/日曆窗口小部件/ HTML表格等)時。

該類可能包含太多的責任處理。它應該重組並分解成更小的類。即,繼Single Responsibility Responsible

查看圖片這裏的想法。

enter image description here

也就是說,創建可重用的頁面片段&讓主網頁對象提供頁面片段。

檢查here瞭解更多信息。