2016-07-17 17 views
7

Trong một trong những bài kiểm tra, tôi cần phải cuộn vào xem của một phần tử có thể được thực hiện thông qua scrollIntoView() phương pháp parameterizing kịch bản với một yếu tố nằm qua thước đo:yếu tố Nằm trong thước đo vs trực tiếp trong JavaScript

var elm = element(by.id("myid")); 
browser.executeScript("arguments[0].scrollIntoView();", elm.getWebElement()); 

Nhưng, chúng tôi cũng có thể tìm thấy nguyên tố này trực tiếp qua getElementById():

browser.executeScript("document.getElementById('myid').scrollIntoView();"); 

sự khác biệt giữa các ứng dụng hai là gì roaches?

scrollIntoView() chỉ được chọn cho mục đích mẫu. Logic bên trong kịch bản có thể phức tạp hơn.

+0

Không có gì khác, chỉ là một trong nhiều cách mà javascript có thể thực hiện. Cái đầu tiên lấy phần tử làm đối số. Cái thứ hai tìm thấy phần tử. – Gurey

+0

Trước tiên, bạn sẽ có quyền kiểm soát việc tìm kiếm các phần tử (nhiều cách) bằng selen. Đối với thứ hai, bạn phải sử dụng một mình – Madhan

Trả lời

6

Đầu tiên sẽ cho bạn biết rõ ràng khi phần tử bị thiếu trong khi phần tử thứ hai sẽ nêu ra lỗi JavaScript nói rằng null không có phương thức .scrollIntoView. Vì vậy, để giữ cái thứ hai có thể duy trì được, bạn cần xử lý hoàn toàn trường hợp khi phần tử bị thiếu và đưa ra một lỗi với một thông báo thích hợp.

Người đầu tiên được tiếp xúc với trạng thái không mong muốn/cũ. Phần tử được tìm thấy bởi element(by.id("myid")) có thể bị xóa khỏi trang ngay trước khi thực hiện browser.executeScript(). Điều thứ hai không phải là tiếp xúc với vấn đề này kể từ khi trang không được cập nhật trong khi kịch bản được thực hiện.

Giá trị thứ hai rẻ hơn vì nó thực hiện một lệnh Selenium (ExecuteScript), trong khi lệnh đầu tiên thực thi hai lệnh (FindElement và ExecuteScript). Việc gửi lệnh Selenium tới trình duyệt tương đối đắt (tối thiểu 25ms) và có thể trở nên quan trọng với nhiều cuộc gọi.

Cả hai đều sẽ tạo ra cùng một kết quả chính xác và sẽ kết thúc bằng cách gọi cùng một API ở phía trình duyệt.

+0

Đó là một tổng quan tuyệt vời về sự khác biệt và tương đồng! Cảm ơn! Một câu hỏi tiếp theo nhanh chóng cho bạn .. Tôi đã đề cập đến một nơi nào đó mà tôi đã làm điều đó [plugin dành cho thước đo độc lập] (https://github.com/alecxe/eslint-plugin-protractor) ..Tôi đang nghĩ về cảnh báo nếu có một lệnh 'executeScript()' và 'document.getElement ..()' được sử dụng gợi ý định vị các phần tử với Thước đo góc và truyền phần tử web qua 'đối số' vào tập lệnh. Bạn có nghĩ rằng nó có ý nghĩa để có loại quy tắc này? Và, nói chung, tôi sẽ đánh giá cao phản hồi của bạn về plugin này. Cảm ơn một lần nữa. – alecxe

+0

Tôi không sử dụng eslint, nhưng tôi cho rằng nên gắn thẻ 'executeScript'. Ý kiến ​​của tôi là nó sẽ không bao giờ xuất hiện trong các bài kiểm tra hoặc các đối tượng trang và chỉ nên có mặt trong một mô-đun phụ để cung cấp các chức năng bổ sung/mở rộng. Bạn không chắc chắn về việc cai trị nội dung vì nó chỉ nên được sử dụng cho các lý do nâng cao/cụ thể. –

+0

Ý tưởng hay, đã tạo yêu cầu tính năng https://github.com/alecxe/eslint-plugin-protractor/issues/39. Bất kỳ phản hồi nào khác đều được chào đón rất nhiều. Cảm ơn! – alecxe

3

Một vài điều cần lưu ý.

  1. Bảo trì sau này. Điều gì xảy ra nếu công cụ định vị phần tử .scrollIntoView() của bạn thay đổi? Tôi nghĩ tôi thích tìm kiếm nguyên tố sử dụng Selen thay vì JS. Giảm cơ hội để có lỗi chính tả, kiểm tra kiểu, và như vậy với một IDE nhưng IDE sẽ không nhìn vào chuỗi chứa JS của bạn.

  2. Trợ năng selen. Vì Selen không thể nhìn thấy các yếu tố vô hình, nó có thể ảnh hưởng đến lựa chọn của bạn. Bạn có muốn một ngoại lệ được ném ra nếu bạn đang cố di chuyển đến một phần tử vô hình không? Selen sẽ cho bạn biết JS sẽ không ở đâu. Có thể bạn muốn cố tình cuộn đến một phần tử vô hình. Việc tìm kiếm các phần tử vô hình là một công việc cho JS chứ không phải là Selenium.

Có thể có nhiều hơn nhưng đây là tất cả những gì tôi có thể nghĩ ra khỏi đầu của tôi.

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