2011-11-03 27 views
22

Khi bạn đang lập mô hình đối tượng trang của mình, bạn sẽ xử lý một trang có biểu mẫu và khoảng 50 trường nhập trên đó như thế nào? Thực hành tốt nhất ở đây là gì?Mô hình đối tượng trang Các phương pháp hay nhất trong Selenium

Bạn có tạo đối tượng trang và viết một chức năng riêng cho từng hành động nhập liệu không? hoặc bạn sẽ viết một chức năng mà các thông số được truyền cho nó và đi vào văn bản?

ví dụ:

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

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

hoặc

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

tôi có thể nhìn thấy trong mô hình đầu tiên, khi viết bài kiểm tra, các bài kiểm tra được mô tả nhiều hơn, nhưng nếu trang chứa quá nhiều lĩnh vực đầu vào, tạo ra các đối tượng trang trở nên cồng kềnh.

bài này cũng khá thú vị trong cơ cấu kiểm tra selen trong trang Objects Functional Automated Testing Best Practices with Selenium WebDriver

+0

Hãy xem [câu hỏi ngăn xếp chồng của tôi] (http://stackoverflow.com/questions/8149808/whats-the-best-way-to-use-selenium-pageobject-design-pattern) để biết ví dụ về cách Tôi sẽ sử dụng mẫu thiết kế đối tượng trang. Tôi không phải 100% bản thân mình nhưng từ rất nhiều đọc, tôi chắc chắn im trên dòng bên phải, hy vọng những gì tôi đã dán giúp bạn. –

+0

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

+1

Bạn có thể đặt tất cả các loại WebElement tương tự vào một Danh sách. vì vậy, nếu bạn có 40 trường văn bản, bạn có thể vẽ từ danh sách từng cái một, nhận được "tên" hoặc "id" để xác định nó, và sau đó hoạt động trên nó. – djangofan

Trả lời

9

Tôi luôn muốn phá vỡ mọi thứ lên thành các nhóm thông tin liên quan. Ví dụ, nếu tôi có một lớp người dùng tôi có thể phá vỡ nó thành một vài lớp nhỏ hơn: LoginCredentials, ProfileInfo, Settings, vv, nhưng tôi vẫn sẽ thường có một lớp người dùng cấp cao nhất có chứa các lớp con này.

Một điều tôi chắc chắn sẽ khuyên bạn nên chuyển đối tượng vào một hàm FillForm thay vì tất cả các hàm riêng lẻ đó. Có một số lợi thế lớn khi sử dụng phương pháp này. Một, bạn có thể có một số đối tượng được cấu hình sẵn "phổ biến" mà bạn sử dụng cho nhiều trường hợp thử nghiệm của mình. Ví dụ:

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); 

HOẶC, bạn có thể tạo đối tượng người bán hoàn toàn mới cho trường hợp thử nghiệm cụ thể nếu cần.Bạn cũng có thể làm những việc như xác nhận lĩnh vực hoặc sử dụng các đối tượng này, hoặc những gì tôi thường làm là phá vỡ các mô hình đối tượng trang để xác nhận lĩnh vực cụ thể, vì vậy nếu tôi xác nhận lĩnh vực miền thương tôi có thể làm điều này:

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

Một ưu điểm quan trọng khác của phương pháp này là nếu trang được cập nhật để thêm, xóa hoặc sửa đổi các trường, bạn chỉ cần cập nhật đối tượng FormInfo và hàm FillForm của bạn, và sẽ không cần sửa đổi các trường hợp thử nghiệm cụ thể gọi hàm FillForm - giả sử họ đang sử dụng một trong các đối tượng FormInfo phổ biến của bạn. Một khả năng khác để có được mức độ phù hợp hơn là thiết lập một trong các đối tượng FormInfo phổ biến của bạn để tạo chuỗi ngẫu nhiên cho mỗi trường tuân thủ độ dài tối thiểu/phút và chu kỳ giữa tất cả các ký tự được phép khác nhau. Điều này cho phép bạn có được một số thử nghiệm bổ sung trong cùng một tập kiểm tra, mặc dù nó cũng có thể thêm một số nhiễu nếu bạn bắt đầu nhận kết quả thất bại chỉ từ các chuỗi cụ thể, vì vậy hãy cẩn thận.

9

Ý tưởng đằng sau mô hình đối tượng trang là nó tóm tắt việc thực hiện ra khỏi người gọi. Trong cơ chế đầu tiên, bạn thực hiện thành công điều đó bởi vì người gọi không cần biết liệu tên trường nhập html có thay đổi từ "firstName" thành "user_first_name" hay không, trong khi thực hiện thứ hai, bất kỳ thay đổi nào trên trang thực tế sẽ phải là bị lừa cho tất cả người gọi đối tượng trang của bạn.

Trong khi nó có thể làm việc nhiều hơn để tạo đối tượng trang của bạn, nếu bạn duy trì đóng gói, nó sẽ lưu công việc trong thời gian dài khi trang html thực sự không tránh khỏi thay đổi.

+0

Cảm ơn digitalJoel, Cách tạo trang với biến định vị công cộng (cách) được định nghĩa ở đầu trang và sau đó trong lớp Test của tôi, tôi khởi tạo trang đó và tôi chuyển các biến định vị vào fillInform chung chung. Theo nghĩa đó, các biến của tôi ở một vị trí, đối tượng trang và tất cả các thử nghiệm của tôi sẽ tham chiếu đến các biến đó, vì vậy khi chúng thay đổi, tôi vẫn phải duy trì ở một vị trí. –

+0

Đó sẽ là một cách để làm điều đó. Có tên là trường cuối cùng tĩnh công khai và sau đó cung cấp một phương thức. Điều đó làm việc cho đến khi bạn cần thực hiện một số xử lý đặc biệt cho một giá trị duy nhất, sau đó bạn có một phương thức riêng biệt cho 'myPage.setSpecialValue (blah)' và cho mọi thứ khác bạn có 'myPage.fillInForm (MyPage.MY_NAME, blah)' và nó không nhất quán, nhưng đó có thể là một cây cầu bạn có thể băng qua khi/nếu bạn đến với nó thay vì phải xây dựng nó ngay bây giờ. Tuỳ bạn. – digitaljoel

+2

"cảm ơn" tốt nhất sẽ là bỏ phiếu cho một số câu trả lời. Trong số 14 câu trả lời cho câu hỏi của bạn, bạn chỉ có bình chọn lên 4 câu trả lời và không chấp nhận bất kỳ câu trả lời nào. Tôi không nói về câu trả lời của tôi, nhưng bất kỳ câu trả lời nào mà bạn thấy hữu ích (giống như câu trả lời của Sam Woods về câu hỏi này) có thể/nên được bình chọn. – digitaljoel

0

Cách tôi làm điều này trong biểu mẫu của tôi là lấy danh sách tất cả các yếu tố đầu vào trên trang. Sau đó loại bỏ bất kỳ yếu tố đầu vào nào không được hiển thị. Sau đó tôi có thể đặt văn bản hợp lệ hoặc không hợp lệ cho mỗi đầu vào. Từ đó tôi nắm bắt được bản tóm tắt xác nhận để đảm bảo rằng tôi nhận được lỗi chính xác hay không. Nếu không thì đăng nhập ngoại lệ.

Điều này cho phép tôi nhập văn bản vào nhiều đầu vào như trên trang và nó vẫn cho phép tôi ghi lại ngoại lệ và gửi chúng qua e-mail. Tôi cũng bắt các trường văn bản và mật khẩu trong danh sách của tôi và tôi có một danh sách riêng biệt cho các trường hộp kiểm và Tùy chọn vì có những thứ khác nhau mà tôi thường muốn làm với các trường đó.

gì nó boils xuống là tất cả tôi phải làm gì để kiểm tra một trang là thế này:

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

Ngoài enterWhatever() phương pháp của bạn, tôi thường cũng tạo ra một phương pháp createWhatever(field1, field2, ...), mà tôi có thể sử dụng để tạo ra một con đường nhanh chóng bất cứ hình thức xây dựng, để sử dụng khi thực Mục đích của thử nghiệm là cái gì khác. Do đó, nếu tôi cần tạo một Khách hàng để kiểm tra việc gửi Vé, kiểm tra sẽ đến trang CreateACustomer và chỉ cần gọi createCustomer(firstName, lastName, emailAddress, ...) và sau đó tiếp tục với nhiệm vụ tạo nhiều vé hơn bằng cách sử dụng Khách hàng đó.

1

tôi trả lời một câu hỏi cũ vì lợi ích của độc giả.

Cùng với các câu trả lời hay khác ở đây, tôi muốn thêm vài đề xuất ở đây cho những người mới sử dụng POM.

Đối tượng trang là mẫu thiết kế nổi tiếng, được các kỹ sư tự động chấp nhận rộng rãi, tạo tệp lớp riêng biệt cho từng trang của ứng dụng để nhóm tất cả các phần tử thành thuộc tính và hành vi/chức năng kinh doanh của họ làm phương thức của lớp. Nhưng có một vài vấn đề trong việc tạo lớp cho một trang - đặc biệt khi trang có nhiều bộ/phần tử phức tạp khác nhau như tiện ích con/lịch/bảng HTML, v.v.

Lớp học có thể chứa quá nhiều trách nhiệm giải quyết. Nó nên được tái cấu trúc và chia thành các lớp nhỏ hơn. Tức là, theo số Single Responsibility Responsible.

Kiểm tra hình ảnh tại đây để biết ý tưởng.

enter image description here

Đó là, tạo ra những mảnh trang tái sử dụng & để cho các đối tượng trang chính phục vụ các mảnh vỡ trang.

Kiểm tra here để biết thêm thông tin.

Các vấn đề liên quan