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ì?
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