2014-03-31 11 views
10

Ich versuche zu überprüfen, dass das fokussierte Element beim Laden der Seite als einer meiner Tests festgelegt ist.Wie stelle ich fest, dass ein Element fokussiert ist?

Dies scheint zu funktionieren, und ich kann mit dem Element Explorer überprüfen, aber die Jasmine Matchers scheinen nicht auf diese zu nehmen.

Hier ist mein Code:

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()); 
}); 

Das Feld selbst wenn der Fokus immer richtig ist die Seite geladen wird (und Element-Explorer mich richtig ermöglicht dies über browser.driver.switchTo().activeElement() abzufragen, so dass ich denke, dieser Test vorbei sein sollte, aber es . ist nicht

Stattdessen erhalte ich eine enorme Stacktrace, die keine nützlichen Informationen anbietet

+0

Was mit geschieht 'erwarten (browser.driver.switchTo() active()) .toBe (loginPage.usernameInput) '? – ivarni

+0

@ivarni - Ich bekomme 'Error: erwarten mit WebElement aufgerufen argument, erwartet ein Versprechen. Wolltest du .getText()? 'Anstelle des großen Stacktrace verwenden? – joshschreuder

+0

OK, ich dachte, das Problem bestünde vielleicht darin, dass '.switchTo(). ActiveElement()' irgendeine Art von asynchronem Nebeneffekt hatte und der Fokus nicht wirklich geändert wurde, nachdem das Expect ausgewertet wurde, aber das war es nicht der Fall dann. – ivarni

Antwort

17

ich glaube, ich eine Abhilfe gefunden:.

Da expect erwartet mit dem Versprechen, genannt zu werden, Sie einige Attribute der beiden WebElements vergleichen können (Ihre Eingabe und die zur Zeit 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

Danke - Ich dachte, ich könnte so etwas machen, ich wünschte nur, es gäbe eine Möglichkeit, die Elementgleichheit zu testen, ohne auf Attribute angewiesen zu sein. Ich denke, das macht den gleichen Job, aber es hängt auch davon ab, dass ich ein einzigartiges Attribut gesetzt habe. – joshschreuder

+0

Ich könnte wahrscheinlich '.getInnerHtml()' oder '.getOuterHtml()' tun, was das gleiche erreichen würde. – joshschreuder

+0

Ich verstehe, deshalb habe ich gesagt, es war nur ein Workaround;). Ja, du kannst das innere oder äußere HTML auch vergleichen, wenn du es bevorzugst – glepretre

1

I endete diese schöne einfache Funktion up mit Fokus zu behaupten.

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

Dies ist keine Lösung für ein Eingabeelement: Es ist immer leer – iRaS

0

ich es geschafft, einen Weg zu finden, ein Element mit dem fokussierten zu vergleichen, ohne auf irgendwelche Attribute Relaying.

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