2013-06-06 20 views
7

Tôi đang thử nghiệm một trang web vẫn đang được phát triển.Ưu điểm/nhược điểm khi sử dụng nhiều bộ định vị cho mỗi phần tử trong Selenium?

Thường thì id, lớp, văn bản hoặc vị trí của phần tử trong DOM sẽ thay đổi. Và sau đó định vị tôi đang sử dụng sẽ không còn có thể tìm thấy phần tử.

Nhưng các tính năng vẫn hoạt động bình thường. Tôi không muốn một số thử nghiệm thất bại khi không có hồi quy thực sự.

Vì vậy, thay vì có một bộ định vị duy nhất cho mỗi phần tử, tôi có một tập hợp các bộ định vị.

public static final ArrayList<By> LOGIN_ANCHOR_LOCATORS = new ArrayList<By>(); 

static { 
    LOGIN_ANCHOR_LOCATORS.add(By.id("loginLink")); 
    LOGIN_ANCHOR_LOCATORS.add(By.linkText("Login")); 
    LOGIN_ANCHOR_LOCATORS.add(By.xpath("/html/body/div[5]/a"));   
} 

Phương pháp của tôi cho việc tìm kiếm nguyên tố này trông như thế này:

public WebElement locateElement(ArrayList<By> locators){ 

    // create an element to return 
    WebElement element = null; 

    // until the desired element is found... 
    while (element == null){ 

     // loop through the locators 
     for (By locator : locators){ 

      // try to find by locator 
      element = customWait.until(ExpectedConditions.presenceOfElementLocated(locator)); 

      // if not found... 
      if (element == null){ 

       // log the failure 
       logFailingLocator(locator); 
      } 
     } 
    } 
    return element; 
} 

Nó cố gắng tìm ra nguyên tố với định vị đầu tiên trong bộ sưu tập, và chỉ khi nó không thành công, hãy thử định vị tiếp theo.

Bộ sưu tập là ArrayList (thứ tự được xác định theo thứ tự chèn), có nghĩa là for loop của tôi sẽ thử từng định vị theo thứ tự chúng được thêm vào Danh sách.

Tôi đã khởi tạo danh sách ở trên bằng cách thêm người định vị theo một thứ tự cụ thể. Id là đầu tiên, bởi vì tôi con số nếu vị trí của phần tử trong DOM thay đổi, nhưng nó vẫn giữ id của nó, thì đó sẽ là cách tôi sẽ có nhiều khả năng xác định vị trí phần tử chính xác. Xpath là cuối cùng bởi vì ngay cả khi id/class/text thay đổi, nhưng vẫn có cùng loại phần tử trong DOM tại vị trí đó, nó có thể là phần tử bên phải, nhưng có thể ít chắc chắn hơn các định vị khác.

Tôi đang sử dụng một chờ đợi thông thạo mà bỏ qua NoSuchElementException:

// Wait 5 seconds for an element to be present on the page, checking 
// for its presence once every quarter of a second. 
Wait<WebDriver> customWait = new FluentWait<WebDriver>(driver) 
     .withTimeout(5L, TimeUnit.SECONDS) 
     .pollingEvery(250L, TimeUnit.MILLISECONDS) 
     .ignoring(NoSuchElementException.class); 

Vì vậy, khi một bộ định vị thất bại, nó sẽ không phá vỡ các vòng lặp - nó chỉ ghi lại thất bại và sau đó vẫn tiếp tục cố gắng tiếp theo định vị.

Nếu tất cả các trình định vị không thành công, thì phần tử sẽ giữ nguyên, thử nghiệm sẽ thất bại và có nhiều khả năng nguyên nhân là sự hồi quy thực sự của các tính năng/chức năng.

Tôi định kỳ kiểm tra nhật ký của mình cho bất kỳ thành phần nào có 1 hoặc 2 trình định vị không thành công và cập nhật chúng trong trang của tôiTrong khi chờ đợi, trong khi thử nghiệm tiếp tục chạy trơn tru.

Ưu và nhược điểm để thiết lập dự án của tôi theo cách này là gì?

+0

Câu hỏi hay, Pat! Tại công việc của tôi, chúng tôi sử dụng [@FindBy] (http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/support/FindBy.html). Bạn đã xem xét nó như là một thay thế? Ví dụ: danh sách riêng '@FindBy (className =" reducePrice ") reducePrice;'. – Brian

Trả lời

2

Đó là một cách tiếp cận thú vị, nhưng tôi lo ngại bạn có thể đang che giấu các vấn đề khác. Tôi muốn làm việc chặt chẽ hơn với các nhà phát triển để tránh phá vỡ các vấn đề giao diện người dùng ngay từ đầu.

ID thay đổi có được tạo động không? Nếu trường hợp đó xảy ra, hãy xem liệu bạn có thể không nhận được hậu tố trên ID hay không, giống như _loginlink. Bạn cũng có thể phải làm việc với XPath bắt đầu từ ID tĩnh lân cận: "// div [@ id = 'login_link_container'/a". (Bắt đầu từ gốc của tài liệu như ví dụ của bạn cho thấy là một công thức cho đau! :))

+0

Được thăng hạng - Tôi đồng ý, sẽ là lý tưởng để làm việc chặt chẽ hơn với các nhà phát triển.Rất tiếc, tôi không có liên hệ với họ. Họ là hoàn toàn riêng biệt, nhiều nhà cung cấp. Lý do tại sao tôi sử dụng đường dẫn đầy đủ cho XPath, bởi vì tôi định id trong trường hợp của tôi có nhiều khả năng thay đổi hơn vị trí của phần tử trong DOM, vì vậy tôi chỉ tránh ID trong XPath để tối đa hóa độ bền, bằng cách không dựa vào thay đổi các yếu tố để giữ lại id của họ là tốt. –

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