Đây là tất cả về bản chất không đồng bộ của JavaScript.
Hiện nay protractor đề xuất một số cách để xử lý các hành động không đồng bộ, (tôi đã không mô tả chaining lời hứa trực tiếp, và máy phát điện ở đây):
1) Promise Manager/Flow Control
https://github.com/SeleniumHQ/selenium/wiki/WebDriverJs#control-flows
Đây là sự trừu tượng mà làm cho tất cả các hành động của bạn được gọi là từng cái một, giống như một hàng đợi. Mỗi hành động trả về một đối tượng đặc biệt - Hứa hẹn. Nó đại diện cho kết quả của hoạt động không đồng bộ, sẽ được nhận trong tương lai.
2) cách thứ hai - async/chờ đợi
https://ponyfoo.com/articles/understanding-javascript-async-await#using-async-await
Nó được trừu tượng mới xung quanh hứa hẹn đối tượng và cho phép dễ dàng chuỗi hành động từng cái một. Lợi thế là việc xây dựng ngôn ngữ bản địa, thay vì Promise Manager, và làm cho mã của bạn trông giống như được đồng bộ hóa, với try/catch và các cấu trúc quen thuộc khác.
Bạn có thể nghĩ đang chờ đợi như "đình chỉ thực thi mã cho đến khi lời hứa trở về từ hành động được giải quyết"
Nhưng async/chờ đợi vẫn hoạt động với lời hứa bên trong.
Vài lời khuyên khi sử dụng async/chờ đợi với protractorJS:
1) Hãy chắc chắn rằng bạn kiểm soát quản lý người khuyết tật dòng chảy/lời hứa: https://github.com/angular/protractor/blob/master/lib/config.ts#L631 Trộn đang chờ đợi với dòng điều khiển kích hoạt có thể dẫn đến kết quả không thể đoán trước.
2) Đừng quên thêm trước tất cả các hành động không đồng bộ của bạn đang chờ (thường là tất cả các phương pháp api thước đo). Nếu bạn quên làm điều này - hành động mà không chờ đợi sẽ không được xếp hàng với các hành động khác, do đó thứ tự các hành động sẽ bị hỏng
3) Đảm bảo bạn đang sử dụng các nút hỗ trợ điều này - ít nhất nodejs 7.8.x (hoặc mới hơn). Nếu nguyên cảo được sử dụng, thiết lập mục tiêu biên dịch là "mục tiêu": "es2017"
More để đọc: https://github.com/igniteram/protractor/blob/93f2e4943cc291064bc04e789b1c33b270446af9/docs/control-flow.md
https://github.com/SeleniumHQ/selenium/wiki/WebDriverJs#option-3-migrate-to-asyncawait