2015-02-14 16 views
10

Tôi đang cố gắng để thực hiện các kịch bản thử nghiệm sau đây:trang Non-góc mở sau khi một nhấp chuột

  • thực hiện một nhấp chuột vào một biểu tượng trên trang
  • khẳng định có một cửa sổ trình duyệt mới mở (tab trong Chrome) và kiểm tra URL hiện tại

vấn đề là trang mở trong một cửa sổ trình duyệt mới là một trang phi góc khi trang chính tôi thực hiện cú nhấp chuột trong là một trang góc.

Đây là nỗ lực đầu tiên của tôi:

it("should show logo", function() { 
    var logo = scope.page.logo; 
    expect(logo.isDisplayed()).toEqual(true); 

    // opens a new page on click 
    logo.click().then(function() { 
     browser.getAllWindowHandles().then(function (handles) { 
      browser.switchTo().window(handles[1]).then(function() { 
       expect(browser.getCurrentUrl()).toEqual('http://myurl.com/'); 
      }); 

      // switch back to the main window 
      browser.switchTo().window(handles[0]); 
     }); 
    }); 
}); 

mà không thành công với:

Error: Error while waiting for Protractor to sync with the page: "angular could not be found on the window"

đó là điều dễ hiểu.

nỗ lực thứ hai của tôi là để chơi xung quanh với ignoreSynchronization boolean flag:

browser.ignoreSynchronization = true; 
logo.click().then(function() { 
    browser.getAllWindowHandles().then(function (handles) { 
     browser.switchTo().window(handles[1]).then(function() { 
      expect(browser.getCurrentUrl()).toEqual('http://myurl.com/'); 
     }); 

     // switch back to the main window 
     browser.switchTo().window(handles[0]); 
    }); 

này thực sự làm cho pass này kiểm tra cụ thể mà không có bất kỳ lỗi, nhưng nó ảnh hưởng đến mọi thử nghiệm được thực hiện sau này, vì browser là một đối tượng toàn cầu và được chia sẻ giữa các thử nghiệm - thước đo góc không còn đồng bộ với góc trên một trang kết quả thành tất cả các loại lỗi.

Tôi nên triển khai thử nghiệm như thế nào?


Là một workaround, tôi có thể thay đổi restartBrowserBetweenTests setting để true và thay đổi ignoreSynchronization giá trị mà không cần bất kỳ vấn đề - nhưng nó chậm các bài kiểm tra một cách đáng kể.

Trả lời

10

Bạn có thể đặt ignoreSynchronization thành sai khi xác minh của bạn hoàn tất. Tuy nhiên, lưu ý rằng ignoreSynchronization là đồng bộ trong khi mọi thứ khác (click/get/etc) là không đồng bộ, vì vậy bạn cần phải cẩn thận với điều đó. Có lẽ cách an toàn nhất là đặt nó thành true trong beforeEach và false trong afterEach, và chỉ cần kiểm tra một lần nhấp chuột duy nhất trong thử nghiệm đó.

+0

Vâng, đặt nó ở cuối khối 'it' đôi khi làm việc đôi khi hoạt động, đôi khi không - hành vi trở nên không nhất quán. Tôi sẽ thử 'beforeEach' và' afterEach' và lấy lại cho bạn. Cảm ơn! – alecxe

+2

Vâng, đặt 'ignoreSynchronization' trở lại thành' false' bên trong 'afterEach()' đã thực hiện thủ thuật! – alecxe

1

Một giải pháp khác: Tôi đã sử dụng sleep từ getWindowHandles là chỉ trả lại một tên cửa sổ (cửa sổ chính/góc cạnh). Hãy cho tôi biết nếu có là một cách tốt hơn.

this.validateProductPageInfo = function (productTitle) { 
    browser.sleep(5000); 
    browser.getAllWindowHandles().then(function (handles) { 
     if (handles.length === 2) { 
      browser.switchTo().window(handles[1]).then(function() { 
       var prodTitle = by.xpath('//h1[@id="fw-pagetitle"]'); 
       browser.driver.findElement(prodTitle).getText().then(function (text) { 
        expect(text).toBe(productTitle); 
       }); 
      }); 
      browser.switchTo().window(handles[0]); 
     } else { 
      console.log("Error in switching to non angular window"); 
     } 
    }); 
}; 
Các vấn đề liên quan