2014-11-06 61 views
1

爲什麼量角器立即運行每行代碼?爲什麼量角器立即運行每行代碼?

所以我有一個網頁是不是寫在角度。我需要基於硒的自動化。我用硒webdriver-js代碼來打它。下面的例子。一旦你登錄,你會被帶到一個有3個問題的頁面。每次登錄時問題的順序都是隨機的。因此,您每次登錄時都不會以相同的順序得到相同的問題。

問題1)你叫什麼名字?

問題2)現在幾點了?

問題3)Wy在這裏?

每個問題的答案都是問題的最後一個字。

答案1)名稱

答案2)它

答案3)這裏

所以,我在想一個簡單的方法來解決這個問題的方法是創建一個if條件語句

var foo = browser.driver.findElement(By.id('question1')).getText(); 
if(foo == What is your name?) { 
browser.driver.findElement(By.id('answer1')).sendKeys('name'); 
} 
else { 
blah 
} 

等等......等等......

但是這個問題我遇到的是Protractor在它到達那個點之前立即運行if語句。在下面的示例中,控制檯會立即打印出控制檯日誌'this sucks',因爲它會立即運行if語句,而不會通過第一步到達頁面然後檢查。

this.foo_test = function() { 
     console.log('starting foo test'); 
     browser.driver.get('http://my-test-url.com/'); 
     browser.sleep(3000); 
     browser.driver.findElement(By.id('login')).click(); 
     browser.sleep(3000); 
     browser.driver.findElement(By.id('user')).sendKeys('user'); 
     browser.driver.findElement(By.id('login_button')).click(); 
     browser.sleep(3000); 

     console.log('getting variable'); 
     var foo = browser.driver.findElement(By.id('question1')).getText(); 
     console.log(foo); 
     if (foo == 'What was the name of your first pet?') { 
      console.log('this is cool'); 
     } 
     else{ 
      console.log('this sucks'); 
     } 
    }; 

回答

0

我不太瞭解有關量角器的知識,但這聽起來像是不識別異步代碼的問題。如果第一個賦值語句是異步的,那麼其餘的代碼將運行而不需要等待它完成。因此,當您嘗試在IF語句中測試它們時,您所期望的值不會存在。

最好的辦法是在回調或承諾中運行其餘的代碼。

0

即使硒認爲它已完成,它仍顯示您的頁面仍在加載。這發生在動態/異步頁面上。瀏覽器()不是很合適,你永遠不知道你需要等待多久。

您可以調查類WebDriverWait,它允許您等待元素出現或超時。

Wait<WebDriver> wait = new WebDriverWait(driver, 50); // timeout is 50 secs 
wait.until(new Function<WebDriver, Boolean>() { 
    public Boolean apply(WebDriver driver) { 
     return (driver.findElement(By.id('question1'))).isDisplayed(); 
    } 
}); 

您也可以嘗試運行一些JavaScript檢查文檔就緒狀態:

​​
3

量角器基礎上WebdriverJS,它使用編程的隱式承諾排隊風格。請參閱:

https://github.com/angular/protractor/blob/master/docs/control-flow.md

這也就意味着,在一個量角器測試每條語句應理解爲入隊承諾,而不是實際執行。因此,例如,該行:

browser.driver.findElement(By.id('question1')).getText() 

是否返回文本,而是返回承諾返回文本。您必須將此承諾傳遞給其他期待API的應用程序,或者提供一個直接處理程序.then()

您在量角器測試中看到的expect調用已被修改爲等待解決的承諾。所以像這樣:

expect(name.getText()).toEqual('Jane Doe'); 

實際上排隊承諾比較左邊的承諾的結果和右邊的值。