Rapporteur - Core APIS (SUITE…)
Dans ce chapitre, apprenons d'autres API de base de Protractor.
API Elements
L'élément est l'une des fonctions globales exposées par le rapporteur. Cette fonction prend un localisateur et renvoie ce qui suit -
- ElementFinder, qui trouve un seul élément basé sur le localisateur.
- ElementArrayFinder, qui trouve un tableau d'éléments en fonction du localisateur.
Les deux méthodes ci-dessus prennent en charge les méthodes de chaînage décrites ci-dessous.
Fonctions de chaînage d'ElementArrayFinder et leurs descriptions
Les éléments suivants sont les fonctions de ElementArrayFinder -
element.all(locator).clone
Comme son nom l'indique, cette fonction créera une copie superficielle du tableau des éléments, c'est-à-dire ElementArrayFinder.
element.all(locator).all(locator)
Cette fonction renvoie essentiellement un nouveau ElementArrayFinder qui pourrait être vide ou contenir les éléments enfants. Il peut être utilisé pour sélectionner plusieurs éléments sous forme de tableau comme suit
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)
Comme son nom l'indique, après avoir appliqué la fonction de filtre à chaque élément dans ElementArrayFinder, il retourne un nouveau ElementArrayFinder avec tous les éléments qui passent la fonction de filtre. Il a essentiellement deux arguments, le premier est ElementFinder et le second est index. Il peut également être utilisé dans les objets de page.
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)
Avec l'aide de cela, nous pouvons obtenir un élément dans ElementArrayFinder par index. Notez que l'index commence à 0 et que les indices négatifs sont encapsulés.
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()
Comme son nom l'indique, cela obtiendra le premier élément pour ElementArrayFinder. Il ne récupérera pas l'élément sous-jacent.
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()
Comme son nom l'indique, cela obtiendra le dernier élément pour ElementArrayFinder. Il ne récupérera pas l'élément sous-jacent.
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)
Il est utilisé pour trouver un tableau d'éléments dans un parent lorsque les appels à $$ peuvent être chaînés.
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()
Comme son nom l'indique, cela comptera le nombre d'éléments représentés par ElementArrayFinder. Il ne récupérera pas l'élément sous-jacent.
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()
Il fera correspondre les éléments avec le chercheur. Il peut renvoyer vrai ou faux. True, s'il y a des éléments présents qui correspondent au chercheur et False sinon.
Example
expect($('.item').isPresent()).toBeTruthy();
element.all(locator).locator
Comme son nom l'indique, il renverra le localisateur le plus pertinent.
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)
Il récupérera les éléments représentés par le ElementArrayFinder.
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)
Comme son nom l'indique, il appellera la fonction d'entrée sur chaque ElementFinder représenté par ElementArrayFinder.
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)
Comme son nom l'indique, il appliquera une fonction de carte sur chaque élément dans ElementArrayFinder. Il a deux arguments. Le premier serait le ElementFinder et le second serait l'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)
Comme son nom l'indique, il appliquera une fonction de réduction à un accumulateur et à chaque élément trouvé à l'aide du localisateur. Cette fonction réduira chaque élément en une seule valeur.
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
Comme son nom l'indique, il évaluera l'entrée si elle est dans la portée des éléments sous-jacents actuels ou non.
Example
View
<span class = "foo">{{letiableInScope}}</span>
Code
let value =
element.all(by.css('.foo')).evaluate('letiableInScope');
element.all(locator).allowAnimations
Comme son nom l'indique, il déterminera si l'animation est autorisée sur les éléments sous-jacents actuels ou non.
Example
element(by.css('body')).allowAnimations(false);
Fonctions de chaînage d'ElementFinder et leurs descriptions
Fonctions de chaînage d'ElementFinder et leurs descriptions -
element(locator).clone
Comme son nom l'indique, cette fonction créera une copie superficielle de ElementFinder.
element(locator).getWebElement()
Il renverra le WebElement représenté par ce ElementFinder et une erreur WebDriver sera renvoyée si l'élément n'existe pas.
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)
Il trouvera un tableau d'éléments dans un parent.
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)
Il trouvera des éléments dans un parent.
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)
Il trouvera un tableau d'éléments dans un parent lorsque les appels à $$ peuvent être chaînés.
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)
Il trouvera des éléments dans un parent lorsque les appels à $ peuvent être chaînés.
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()
Il déterminera si l'élément est présenté sur la page ou non.
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()
C'est la même chose que element (locator) .isPresent (). La seule différence est qu'il vérifiera si l'élément identifié par sublocator est présent plutôt que le chercheur d'élément actuel.
element.all(locator).evaluate
Comme son nom l'indique, il évaluera l'entrée si elle est sur la portée des éléments sous-jacents actuels ou non.
Example
View
<span id = "foo">{{letiableInScope}}</span>
Code
let value = element(by.id('.foo')).evaluate('letiableInScope');
element(locator).allowAnimations
Comme son nom l'indique, il déterminera si l'animation est autorisée sur les éléments sous-jacents actuels ou non.
Example
element(by.css('body')).allowAnimations(false);
element(locator).equals
Comme son nom l'indique, il comparera un élément pour l'égalité.
Localisateurs (par) API
Il s'agit essentiellement d'une collection de stratégies de localisation d'éléments qui fournit des moyens de rechercher des éléments dans les applications angulaires par liaison, modèle, etc.
Functions and their descriptions
Les fonctions de l'API ProtractorLocators sont les suivantes -
by.addLocator(locatorName,fuctionOrScript)
Il ajoutera un localisateur à cette instance de ProtrcatorBy qui pourra en outre être utilisé avec element (by.locatorName (args)).
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
Comme son nom l'indique, il trouvera un élément par liaison de texte. Une correspondance partielle sera effectuée afin que tous les éléments liés aux variables contenant la chaîne d'entrée soient renvoyés.
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
Comme son nom l'indique, il trouvera un élément par liaison exacte.
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)
Comme son nom l'indique, il trouvera un élément par l'expression ng-model.
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
Comme son nom l'indique, il trouvera un bouton par texte.
Example
View
<button>Save</button>
Code
element(by.buttonText('Save'));
by.partialButtonText
Comme son nom l'indique, il trouvera un bouton par texte partiel.
Example
View
<button>Save my file</button>
Code
element(by.partialButtonText('Save'));
by.repeater
Comme son nom l'indique, il trouvera un élément à l'intérieur d'un ng-repeat.
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
Comme son nom l'indique, il trouvera un élément par répéteur exact.
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
Comme son nom l'indique, il trouvera les éléments, contenant la chaîne exacte, par CSS
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)
Comme son nom l'indique, il trouvera un élément par l'expression ng-options.
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)
Comme son nom l'indique, il trouvera un élément par sélecteur CSS dans le shadow 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);