2014-03-31 29 views
10

我試圖驗證聚焦的元素是在頁面加載時設置爲我的測試之一。我如何聲明一個元素是專注於?

這似乎是工作,我可以驗證與元素瀏覽器,但茉莉花匹配器似乎並沒有拿起這一點。

這裏是我的代碼:

var LoginPage = function() { 
    this.basePath = browser.params.baseUrl; 
    this.loginPart = "/#/login"; 
    this.usernameInput = element(by.model('username')); 

    this.get = function() { ... } 
} 

it('should focus on the username field on load', function() { 
    loginPage.get(); 
    expect(loginPage.usernameInput).toBe(browser.driver.switchTo().activeElement()); 
}); 

場本身是正確獲得焦點,當頁面加載(和元素探險正確地讓我通過browser.driver.switchTo().activeElement()查詢這一點,所以我覺得這個測試應該通過,但是它。是不是

相反,我得到它並沒有提供任何有用的信息,一個巨大的堆棧跟蹤

+0

使用,會發生什麼'希望(browser.driver.switchTo()activeElement() ).toBe(loginPage.usernameInput)'? – ivarni

+0

@ivarni - 我得到了'錯誤:希望用WebElement argment調用,期待一個Promise。你的意思是使用.getText()?而不是大堆棧跟蹤。 – joshschreuder

+0

好吧,我在想也許問題是'.switchTo()。activeElement()'有某種異步副作用,並且在期望被評估之後焦點並沒有真正改變,直到那麼情況。 – ivarni

回答

17

我想我找到了一個解決辦法:

由於expect期待與承諾被調用,您可以比較兩個webElements的一些屬性(你的輸入和當前activeElement):

it('should focus on the username field on load', function() { 
    loginPage.get(); 
    expect(loginPage.usernameInput.getAttribute('id')).toEqual(browser.driver.switchTo().activeElement().getAttribute('id')); 
}); 
+0

謝謝 - 我想我可以做那樣的事情,只是希望有一種測試元素平等而不依賴於屬性的方式。我想這是做同樣的工作,但它也依賴於我設置了一個獨特的屬性。 – joshschreuder

+0

我想我可能會做'.getInnerHtml()'或'.getOuterHtml()'這將實現同樣的事情。 – joshschreuder

+0

我明白,這就是爲什麼我說這只是一種解決方法;)。是的,你可以比較內部或外部的HTML如果你願意 – glepretre

1

最後我用這個漂亮的簡單的函數來斷言焦點。

var expectToBeFocused = function(element){ 
    return expect(element.getInnerHtml()). 
    toBe(browser.driver.switchTo().activeElement().getInnerHtml()); 
}; 
+1

這不是輸入元素的解決方案:每次都是空的 – iRaS

0

我設法找到一種方法來比較聚焦的一個元素但中繼到任何屬性:

element(by.css('div.my-class')).equals(browser.driver.switchTo().activeElement()) 
    .then(equals => expect(equals).toBe(true));