có vẻ như bạn đang cố gắng xây dựng một khuôn khổ dựa trên từ khóa. Thành thật mà nói, tôi rất ngạc nhiên khi nghe bất kỳ câu chuyện thành công nào về điều đó. Đã luôn luôn tự hỏi mục đích thực sự của loại khung như vậy là gì? Ai sẽ dùng nó? Người quản lý, QA thủ công hoặc bên liên quan? Đối với tôi nó không có ý nghĩa liên quan đến những người không công nghệ trong các hoạt động tự động hóa thử nghiệm. Bất kỳ tự động hóa đòi hỏi kỹ năng công nghệ tốt (bao gồm lập trình và devops). Nếu không, xác suất thất bại là khá cao.
Dù sao, câu hỏi của bạn là nhiều hơn về strings
và functional interfaces
ánh xạ hoặc sử dụng phản chiếu rất thông minh. Nhưng vấn đề chính là bạn đã chọn sai [đầu vào] API cho điều đó. Dòng sau:
driver.findElement(locator).doSmth();
là cách đúng để không thành công, vì findElement
sử dụng ngầm ẩn. Và tôi chắc chắn 100% rằng bạn sẽ bắt đầu tái cấu trúc toàn cầu/sửa đổi cách tiếp cận được triển khai, khi bạn phải đối mặt với NoSuchElementException
/StaleElementReferenceException
.
Cảm giác thông thường gợi ý sử dụng sự chờ đợi trôi chảy với ExpectedConditions
. Nhưng nó sẽ làm cho công việc của bạn trở nên phức tạp hơn, bên cạnh những người định vị và hành động bạn phải suy nghĩ về các điều kiện cần được người dùng cung cấp.
Từ điểm kỹ thuật, tôi sẽ tạo trình bao bọc phổ biến trước tiên để đóng gói các cuộc gọi API WebDriver cấp thấp.Sẽ dễ dàng hơn nhiều khi lập bản đồ hoặc phản ánh các chức năng như vậy so với các cuộc gọi thô. Ví dụ. điều kiện dự kiến có thể bị ẩn trên cấp độ enum:
@Getter
@RequiredArgsConstructor
public enum WaitCondition {
visible(ExpectedConditions::visibilityOfElementLocated),
enabled(ExpectedConditions::elementToBeClickable);
private final Function<By, ExpectedCondition<WebElement>> type;
}
Sẽ dễ dàng truy xuất hằng số bắt buộc bằng cách gọi điện, ví dụ: WaitCondition.valueOf("visible")
, trong đó chuỗi đầu vào có thể được truyền từ bên ngoài.
wrapper API chung có thể trông giống như sau sau đó: ví dụ
protected void click(By locator) {
click(locator, enabled);
}
protected void click(By locator, WaitCondition condition) {
waitFor(locator, condition).click();
}
private WebElement waitFor(By locator, WaitCondition condition) {
return wait.until(condition.getType().apply(locator));
}
Mapping/phản ánh đã được cung cấp bởi những người khác trong chủ đề này. Chỉ cần lưu ý: nếu bạn thích sự phản chiếu, tôi khuyên bạn nên xem thư viện jOOR, đơn giản hóa quy trình này.
Tôi thực sự xin lỗi vì tôi đang hỏi một câu hỏi khác trong cùng một câu hỏi. Điều gì xảy ra nếu 'id' của tôi cũng được lưu trữ trong một biến. Ví dụ, một biến chứa 'id' hoặc' xpath' dựa trên đó tôi phải thực hiện hành động: 'driver.findElement (By. <Đến từ giá trị biến> (" id1 ")). ' Trong trường hợp này, giải pháp của bạn có thể được mở rộng ra sao? –
@OmSao Tôi đã thay đổi mã một chút và thêm câu trả lời cho câu hỏi thứ hai của bạn. Vui lòng cho tôi biết nếu mã này hoạt động vì tôi chưa thử nghiệm. –