2016-07-19 3 views
0

Unter Verwendung des Winkelmessers ist es mein Ziel, auf den Aktualisierungsknopf zu klicken, da der Name value eindeutig ist.Das Finden von Enkelelementen des gleichen Großelternteils mit dem Winkelmesser

<div class="Employee"> 
    <div class="address"> 
    <button class="street" value="update"/> 
    </div> 
    <div class="profile"> 
    <div class="name" value="Joe Smith"/> 
    </div> 
</div> 
<div class="Employee"> 
    <div class="address"> 
    <button class="street" value="update"/> 
    </div> 
    <div class="profile"> 
    <div class="name" value="Jane Smith"/> 
    </div> 
</div> 

So versucht hat, für alle ‚Mitarbeiter‘ Elemente Suchen alle Eltern zu finden und dann zu finden, das Filtern, die ‚Mitarbeiter‘ Element hat das besondere Kind mit dem Wert von ‚Jane Smith‘. Verwenden Sie dann dieses übergeordnete Element, um auf die Schaltfläche Aktualisieren zu klicken.

element.all(by.css('[class="Employee"]')).filter(function (elem,index) { 
    if(elem.element(by.css('[value="Jane Smith"]')).isPresent()){ 
    return elem 
    } 
}).then(function (elem) { 
    elem[0].element(by.css('[value="update"]')).click() 
}) 

Das Problem ist, dass in der ‚if‘ Anweisung, es immer wahr ist gleich und ich bin nicht sicher, warum.

Vielleicht gibt es einen anderen Ansatz, um dies zu lösen, ohne XPaths als dieser Umgebung mit immer

Antwort

0

In Bezug auf Ihre if-Anweisung, sollte es aussehen wie folgt aus:

elem.element(by.css('[value="Jane Smith"]')).isPresent()) 
    .then(function (result) { 
     if (result) { } //true 
     else { } 
    } 
1

verändert ich filter nicht sehr oft mit unserer App verwenden, so ein bisschen ein Schuss im Dunkeln, aber ich glaube, dass Sie eine brauchen zusätzliche return Aussage. Prüfen Sie, ob das funktioniert für Sie:

element.all(by.css('[class="Employee"]')).filter(function (elem,index) { 
    return elem.element(by.css('[value="Jane Smith"]')).isPresent().then(function(val) { 
     return val == true; // or val === true if you prefer 
    }); 
}).then(function (items) { 
    console.log(items.length) // just to check the number is what you expect 
    items[0].element(by.css('[value="update"]')).click() 
}); 
1

@Gunderson's correct answer zu verlängern.

Das Problem ist, dass in der 'if' Aussage es immer gleich ist und ich weiß nicht warum.

Dies liegt daran, isPresent() Verfahren wie fast alles in Protractor ein Versprechen kehrt die „truthy“ vorbelegt ist. Sie müssen das Versprechen lösen, um tatsächlich einen echten Wert zu erhalten.

Außerdem würde ich den Locator und die Art und Weise verbessern Sie das ein inneres Element Ortung - Sie first() und einfach Kette die element Anrufs nutzen können, keine Notwendigkeit für then() in diesem Fall:

$$(".Employee").filter(function (elem) { 
    return elem.$('[value="Jane Smith"]').isPresent().then(function(isPresent) { 
     return isPresent; 
    }); 
}).first().$('[value="update"]').click(); 

Fabrikat sicher zu studieren Promises and the Control Flow Dokumentation, um mehr Verständnis für das Konzept der Versprechen und der Kontrollfluss, die die unter der Haube Mechanismus Aufrechterhaltung der Warteschlange von Versprechen und löst sie zu verstehen.


Beachten Sie, dass Sie Ansatz mit einem XPath expression und in einer einzigen Zeile haben könnten - obwohl das nicht gut lesbar ist, auf der Suche zerbrechlich und schwieriger zu warten:

var updateButton = element(by.xpath("//div[@class='Employee' and div[@class='profile']/div[@class='name']/@value = 'Jane Smith']/div[@class='address']/button[@value='update']")); 
updateButton.click(); 
Verwandte Themen