2017-06-22 27 views
5

Tôi mới dùng thước đo góc. Tính năng async/await trong chức năng này hoạt động như thế nào? Ai có thể giải thích cho tôi không?Giải thích về async/await in Protractor

it('TC_01 - Verify Cockpit page title', async (done) => { 
    headerPage.waitForTitleContain('PEAX', 30000); 
    expect(await headerPage.getTitle()).toEqual('PEAX'); 
    done(); 
}); 

Trả lời

8

Đâ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

-3

Để chờ, bạn sẽ cần xử lý lời hứa bằng chức năng sau đó. Các mã dưới đây sẽ cung cấp cho bạn một ý tưởng.

element(by.xpath("xpath")).click().then(function(){ 
     var list = element(by.id('id')); 
     var until = protractor.ExpectedConditions; 
     browser.wait(until.presenceOf(list), 80000, 'Message: took too long'); 
    });