2015-11-22 162 views
2

我只是一個星期的舊量器和茉莉花。我正在嘗試一下Promises。我的測試試圖獲取元素的原始文本,並用新文本重新命名。下面是我想要的代碼,但產量並不如預期:量角器承諾

element(by.css("css of the element")).getText().then(function(oldText) { 
    newElementName= oldText + "-New Name"; 
}); 

    browser.actions().doubleClick(element(by.css("css of the element")).perform(); 
    element(by.css("")).sendKeys(newElementName,protractor.Key.ENTER); 

    element(by.css("")).getText(). 
      then(function(afterRename) { 
      expect(afterRename).toEqual(newElementName); 

我想「newElementName」的值爲「oldText,新名稱」,而是將其設置爲「不確定」。

根據我迄今爲止的理解,腳本被解析並創建了一個承諾鏈,引用自https://github.com/angular/protractor/issues/909。因此對於上面的代碼,承諾將按照.getText(),.then(),.perform()referenced,.sendKeys(),.getText(),.then(),expect()的順序排列。

爲什麼在newElementName得到解決之前執行.perform()和.sendkeys()? 注意:無需雙擊該元素即可編輯文本。

也沒有人有任何好的教程或「延期對象」的鏈接?我看了很多鏈接,但找不到任何可以幫助我理解這個概念的東西。

回答

2

問題是,當您致電sendKeys()時,getText()承諾不會解決。它會在sendKeys()返回的承諾解決之前解決,但在此時已經太晚了:參數(newElementName)已經傳遞了未定義的值。

您需要做的是在撥打sendKeys()之前先完成承諾。另外請記住,ElementFinder可以重複使用。

var theElement = element(by.css("css of the element")); 
theElement.getText().then(function(oldText) { 
    newElementName = oldText + "-New Name"; 
    browser.actions() 
    .doubleClick(theElement) 
    .sendKeys(newElementName, protractor.Key.ENTER) 
    .perform(); 
    afterRename = theElement.getText(); 
}); 

expect(afterRename).toEqual(newElementName); 
+0

謝謝SkinnyJ!這就是我現在的代碼的樣子。但是我認爲「controlFlow」會先移動到下一個承諾(sendKeys()),然後解決(之前的())。 – FindABug

+0

按下輸入速度太快,這裏是完整的評論: 但是,如果你考慮舊代碼,我認爲「controlFlow」將移動到下一個承諾(sendKeys())之前的承諾(getText())解決。只是想了解承諾和他們的異步性質,讓我知道如果我失去了一些東西。 – FindABug

+1

@FindABug控制流程確保承諾***按照順序解決***,但實際功能都是在任何承諾解決之前立即調用。 [這裏](https://github.com/angular/protractor/blob/master/docs/control-flow.md)是一個體面的描述。 –