Winkelmesser - Core APIS (FORTSETZUNG…)
In diesem Kapitel lernen wir einige weitere Kern-APIs von Protractor kennen.
Elements API
Element ist eine der globalen Funktionen des Winkelmessers. Diese Funktion nimmt einen Locater und gibt Folgendes zurück:
- ElementFinder, der ein einzelnes Element basierend auf dem Locator findet.
- ElementArrayFinder, der ein Array von Elementen basierend auf dem Locator findet.
Beide oben genannten unterstützen Verkettungsmethoden, wie unten diskutiert.
Verkettungsfunktionen von ElementArrayFinder und deren Beschreibungen
Das Folgende sind die Funktionen von ElementArrayFinder -
element.all(locator).clone
Wie der Name schon sagt, erstellt diese Funktion eine flache Kopie des Arrays der Elemente, dh ElementArrayFinder.
element.all(locator).all(locator)
Diese Funktion gibt grundsätzlich einen neuen ElementArrayFinder zurück, der leer sein oder die untergeordneten Elemente enthalten kann. Es kann wie folgt zum Auswählen mehrerer Elemente als Array verwendet werden
Example
element.all(locator).all(locator)
elementArr.all(by.css(‘.childselector’));
// it will return another ElementFindArray as child element based on child locator.
element.all(locator).filter(filterFn)
Wie der Name schon sagt, wird nach dem Anwenden der Filterfunktion auf jedes Element in ElementArrayFinder ein neuer ElementArrayFinder mit allen Elementen zurückgegeben, die die Filterfunktion übergeben. Grundsätzlich gibt es zwei Argumente: erstens ElementFinder und zweitens Index. Es kann auch in Seitenobjekten verwendet werden.
Example
View
<ul class = "items">
<li class = "one">First</li>
<li class = "two">Second</li>
<li class = "three">Third</li>
</ul>
Code
element.all(by.css('.items li')).filter(function(elem, index) {
return elem.getText().then(function(text) {
return text === 'Third';
});
}).first().click();
element.all(locator).get(index)
Mit dieser Hilfe können wir ein Element innerhalb des ElementArrayFinder nach Index abrufen. Beachten Sie, dass der Index bei 0 beginnt und negative Indizes umbrochen werden.
Example
View
<ul class = "items">
<li>First</li>
<li>Second</li>
<li>Third</li>
</ul>
Code
let list = element.all(by.css('.items li'));
expect(list.get(0).getText()).toBe('First');
expect(list.get(1).getText()).toBe('Second');
element.all(locator).first()
Wie der Name schon sagt, erhält dies das erste Element für ElementArrayFinder. Das zugrunde liegende Element wird nicht abgerufen.
Example
View
<ul class = "items">
<li>First</li>
<li>Second</li>
<li>Third</li>
</ul>
Code
let first = element.all(by.css('.items li')).first();
expect(first.getText()).toBe('First');
element.all(locator).last()
Wie der Name schon sagt, erhält dies das letzte Element für ElementArrayFinder. Das zugrunde liegende Element wird nicht abgerufen.
Example
View
<ul class = "items">
<li>First</li>
<li>Second</li>
<li>Third</li>
</ul>
Code
let first = element.all(by.css('.items li')).last();
expect(last.getText()).toBe('Third');
element.all(locator).all(selector)
Es wird verwendet, um ein Array von Elementen in einem übergeordneten Element zu finden, wenn Aufrufe von $$ verkettet werden können.
Example
View
<div class = "parent">
<ul>
<li class = "one">First</li>
<li class = "two">Second</li>
<li class = "three">Third</li>
</ul>
</div>
Code
let items = element(by.css('.parent')).$$('li');
element.all(locator).count()
Wie der Name schon sagt, zählt dies die Anzahl der von ElementArrayFinder dargestellten Elemente. Das zugrunde liegende Element wird nicht abgerufen.
Example
View
<ul class = "items">
<li>First</li>
<li>Second</li>
<li>Third</li>
</ul>
Code
let list = element.all(by.css('.items li'));
expect(list.count()).toBe(3);
element.all(locator).isPresent()
Es werden die Elemente mit dem Finder abgeglichen. Es kann wahr oder falsch zurückgeben. Richtig, wenn Elemente vorhanden sind, die mit dem Finder übereinstimmen, und ansonsten Falsch.
Example
expect($('.item').isPresent()).toBeTruthy();
element.all(locator).locator
Wie der Name schon sagt, wird der relevanteste Locator zurückgegeben.
Example
$('#ID1').locator();
// returns by.css('#ID1')
$('#ID1').$('#ID2').locator();
// returns by.css('#ID2')
$$('#ID1').filter(filterFn).get(0).click().locator();
// returns by.css('#ID1')
element.all(locator).then(thenFunction)
Es werden die vom ElementArrayFinder dargestellten Elemente abgerufen.
Example
View
<ul class = "items">
<li>First</li>
<li>Second</li>
<li>Third</li>
</ul>
Code
element.all(by.css('.items li')).then(function(arr) {
expect(arr.length).toEqual(3);
});
element.all(locator).each(eachFunction)
Wie der Name schon sagt, wird die Eingabefunktion für jeden ElementFinder aufgerufen, der vom ElementArrayFinder dargestellt wird.
Example
View
<ul class = "items">
<li>First</li>
<li>Second</li>
<li>Third</li>
</ul>
Code
element.all(by.css('.items li')).each(function(element, index) {
// It will print First 0, Second 1 and Third 2.
element.getText().then(function (text) {
console.log(index, text);
});
});
element.all(locator).map(mapFunction)
Wie der Name schon sagt, wird auf jedes Element im ElementArrayFinder eine Kartenfunktion angewendet. Es gibt zwei Argumente. Erstens wäre der ElementFinder und zweitens wäre der Index.
Example
View
<ul class = "items">
<li>First</li>
<li>Second</li>
<li>Third</li>
</ul>
Code
let items = element.all(by.css('.items li')).map(function(elm, index) {
return {
index: index,
text: elm.getText(),
class: elm.getAttribute('class')
};
});
expect(items).toEqual([
{index: 0, text: 'First', class: 'one'},
{index: 1, text: 'Second', class: 'two'},
{index: 2, text: 'Third', class: 'three'}
]);
element.all(locator).reduce(reduceFn)
Wie der Name schon sagt, wird eine Reduzierungsfunktion auf einen Akkumulator und jedes Element angewendet, das mit dem Locator gefunden wurde. Diese Funktion reduziert jedes Element auf einen einzigen Wert.
Example
View
<ul class = "items">
<li>First</li>
<li>Second</li>
<li>Third</li>
</ul>
Code
let value = element.all(by.css('.items li')).reduce(function(acc, elem) {
return elem.getText().then(function(text) {
return acc + text + ' ';
});
}, '');
expect(value).toEqual('First Second Third ');
element.all(locator).evaluate
Wie der Name schon sagt, wird die Eingabe ausgewertet, ob sie im Umfang der aktuell zugrunde liegenden Elemente liegt oder nicht.
Example
View
<span class = "foo">{{letiableInScope}}</span>
Code
let value =
element.all(by.css('.foo')).evaluate('letiableInScope');
element.all(locator).allowAnimations
Wie der Name schon sagt, wird bestimmt, ob die Animation für die aktuell zugrunde liegenden Elemente zulässig ist oder nicht.
Example
element(by.css('body')).allowAnimations(false);
Verkettungsfunktionen von ElementFinder und deren Beschreibungen
Verkettungsfunktionen von ElementFinder und deren Beschreibungen -
element(locator).clone
Wie der Name schon sagt, erstellt diese Funktion eine flache Kopie des ElementFinder.
element(locator).getWebElement()
Es wird das von diesem ElementFinder dargestellte WebElement zurückgegeben und ein WebDriver-Fehler wird ausgelöst, wenn das Element nicht vorhanden ist.
Example
View
<div class="parent">
some text
</div>
Code
// All the four following expressions are equivalent.
$('.parent').getWebElement();
element(by.css('.parent')).getWebElement();
browser.driver.findElement(by.css('.parent'));
browser.findElement(by.css('.parent'));
element(locator).all(locator)
Es wird ein Array von Elementen in einem übergeordneten Element gefunden.
Example
View
<div class = "parent">
<ul>
<li class = "one">First</li>
<li class = "two">Second</li>
<li class = "three">Third</li>
</ul>
</div>
Code
let items = element(by.css('.parent')).all(by.tagName('li'));
element(locator).element(locator)
Es werden Elemente innerhalb eines übergeordneten Elements gefunden.
Example
View
<div class = "parent">
<div class = "child">
Child text
<div>{{person.phone}}</div>
</div>
</div>
Code
// Calls Chain 2 element.
let child = element(by.css('.parent')).
element(by.css('.child'));
expect(child.getText()).toBe('Child text\n981-000-568');
// Calls Chain 3 element.
let triple = element(by.css('.parent')).
element(by.css('.child')).
element(by.binding('person.phone'));
expect(triple.getText()).toBe('981-000-568');
element(locator).all(selector)
Es wird ein Array von Elementen in einem übergeordneten Element gefunden, wenn Aufrufe von $$ verkettet werden können.
Example
View
<div class = "parent">
<ul>
<li class = "one">First</li>
<li class = "two">Second</li>
<li class = "three">Third</li>
</ul>
</div>
Code
let items = element(by.css('.parent')).$$('li'));
element(locator).$(locator)
Es werden Elemente innerhalb eines übergeordneten Elements gefunden, wenn Aufrufe von $ verkettet werden können.
Example
View
<div class = "parent">
<div class = "child">
Child text
<div>{{person.phone}}</div>
</div>
</div>
Code
// Calls Chain 2 element.
let child = element(by.css('.parent')).
$('.child'));
expect(child.getText()).toBe('Child text\n981-000-568');
// Calls Chain 3 element.
let triple = element(by.css('.parent')).
$('.child')).
element(by.binding('person.phone'));
expect(triple.getText()).toBe('981-000-568');
element(locator).isPresent()
Es wird bestimmt, ob das Element auf der Seite dargestellt wird oder nicht.
Example
View
<span>{{person.name}}</span>
Code
expect(element(by.binding('person.name')).isPresent()).toBe(true);
// will check for the existence of element
expect(element(by.binding('notPresent')).isPresent()).toBe(false);
// will check for the non-existence of element
element(locator).isElementPresent()
Es ist dasselbe wie element (locator) .isPresent (). Der einzige Unterschied besteht darin, dass geprüft wird, ob das vom Sublocator identifizierte Element vorhanden ist und nicht der aktuelle Elementfinder.
element.all(locator).evaluate
Wie der Name schon sagt, wird die Eingabe ausgewertet, ob sie sich im Umfang der aktuell zugrunde liegenden Elemente befindet oder nicht.
Example
View
<span id = "foo">{{letiableInScope}}</span>
Code
let value = element(by.id('.foo')).evaluate('letiableInScope');
element(locator).allowAnimations
Wie der Name schon sagt, wird bestimmt, ob die Animation für die aktuell zugrunde liegenden Elemente zulässig ist oder nicht.
Example
element(by.css('body')).allowAnimations(false);
element(locator).equals
Wie der Name schon sagt, wird ein Element auf Gleichheit verglichen.
Locators (by) API
Es handelt sich im Grunde genommen um eine Sammlung von Elementlokalisierungsstrategien, die Möglichkeiten zum Auffinden von Elementen in Angular-Anwendungen durch Binden, Modellieren usw. bieten.
Functions and their descriptions
Die Funktionen der ProtractorLocators-API lauten wie folgt:
by.addLocator(locatorName,fuctionOrScript)
Dieser Instanz von ProtrcatorBy wird ein Locator hinzugefügt, der weiter mit element (by.locatorName (args)) verwendet werden kann.
Example
View
<button ng-click = "doAddition()">Go!</button>
Code
// Adding the custom locator.
by.addLocator('buttonTextSimple', function(buttonText, opt_parentElement, opt_rootSelector) {
var using = opt_parentElement || document,
buttons = using.querySelectorAll('button');
return Array.prototype.filter.call(buttons, function(button) {
return button.textContent === buttonText;
});
});
element(by.buttonTextSimple('Go!')).click();// Using the custom locator.
by.binding
Wie der Name schon sagt, wird ein Element durch Textbindung gefunden. Eine teilweise Übereinstimmung wird durchgeführt, so dass alle Elemente, die an die Variablen gebunden sind, die die Eingabezeichenfolge enthalten, zurückgegeben werden.
Example
View
<span>{{person.name}}</span>
<span ng-bind = "person.email"></span>
Code
var span1 = element(by.binding('person.name'));
expect(span1.getText()).toBe('Foo');
var span2 = element(by.binding('person.email'));
expect(span2.getText()).toBe('[email protected]');
by.exactbinding
Wie der Name schon sagt, wird es durch exakte Bindung ein Element finden.
Example
View
<spangt;{{ person.name }}</spangt;
<span ng-bind = "person-email"gt;</spangt;
<spangt;{{person_phone|uppercase}}</span>
Code
expect(element(by.exactBinding('person.name')).isPresent()).toBe(true);
expect(element(by.exactBinding('person-email')).isPresent()).toBe(true);
expect(element(by.exactBinding('person')).isPresent()).toBe(false);
expect(element(by.exactBinding('person_phone')).isPresent()).toBe(true);
expect(element(by.exactBinding('person_phone|uppercase')).isPresent()).toBe(true);
expect(element(by.exactBinding('phone')).isPresent()).toBe(false);
by.model(modelName)
Wie der Name schon sagt, wird ein Element durch den Ausdruck ng-model gefunden.
Example
View
<input type = "text" ng-model = "person.name">
Code
var input = element(by.model('person.name'));
input.sendKeys('123');
expect(input.getAttribute('value')).toBe('Foo123');
by.buttonText
Wie der Name schon sagt, wird eine Schaltfläche per Text gefunden.
Example
View
<button>Save</button>
Code
element(by.buttonText('Save'));
by.partialButtonText
Wie der Name schon sagt, wird eine Schaltfläche durch Teiltext gefunden.
Example
View
<button>Save my file</button>
Code
element(by.partialButtonText('Save'));
by.repeater
Wie der Name schon sagt, findet es ein Element in einer ng-Wiederholung.
Example
View
<div ng-repeat = "cat in pets">
<span>{{cat.name}}</span>
<span>{{cat.age}}</span>
<</div>
<div class = "book-img" ng-repeat-start="book in library">
<span>{{$index}}</span>
</div>
<div class = "book-info" ng-repeat-end>
<h4>{{book.name}}</h4>
<p>{{book.blurb}}</p>
</div>
Code
var secondCat = element(by.repeater('cat in
pets').row(1)); // It will return the DIV for the second cat.
var firstCatName = element(by.repeater('cat in pets').
row(0).column('cat.name')); // It will return the SPAN for the first cat's name.
by.exactRepeater
Wie der Name schon sagt, findet es ein Element durch exakten Repeater.
Example
View
<li ng-repeat = "person in peopleWithRedHair"></li>
<li ng-repeat = "car in cars | orderBy:year"></li>
Code
expect(element(by.exactRepeater('person in
peopleWithRedHair')).isPresent())
.toBe(true);
expect(element(by.exactRepeater('person in
people')).isPresent()).toBe(false);
expect(element(by.exactRepeater('car in cars')).isPresent()).toBe(true);
by.cssContainingText
Wie der Name schon sagt, werden die Elemente, die die genaue Zeichenfolge enthalten, per CSS gefunden
Example
View
<ul>
<li class = "pet">Dog</li>
<li class = "pet">Cat</li>
</ul>
Code
var dog = element(by.cssContainingText('.pet', 'Dog'));
// It will return the li for the dog, but not for the cat.
by.options(optionsDescriptor)
Wie der Name schon sagt, wird ein Element durch den Ausdruck ng-options gefunden.
Example
View
<select ng-model = "color" ng-options = "c for c in colors">
<option value = "0" selected = "selected">red</option>
<option value = "1">green</option>
</select>
Code
var allOptions = element.all(by.options('c for c in colors'));
expect(allOptions.count()).toEqual(2);
var firstOption = allOptions.first();
expect(firstOption.getText()).toEqual('red');
by.deepCSS(selector)
Wie der Name schon sagt, findet es ein Element per CSS-Selektor im Schatten-DOM.
Example
View
<div>
<span id = "outerspan">
<"shadow tree">
<span id = "span1"></span>
<"shadow tree">
<span id = "span2"></span>
</>
</>
</div>
Code
var spans = element.all(by.deepCss('span'));
expect(spans.count()).toEqual(3);