Kątomierz - Core APIS (CD.…)

W tym rozdziale poznajmy więcej podstawowych interfejsów API Protractora.

Elements API

Element jest jedną z globalnych funkcji ujawnionych przez kątomierz. Ta funkcja przyjmuje lokalizator i zwraca następujące -

  • ElementFinder, który znajduje pojedynczy element na podstawie lokalizatora.
  • ElementArrayFinder, który znajduje tablicę elementów na podstawie lokalizatora.

Obie powyższe metody obsługują łańcuchy, jak omówiono poniżej.

Łańcuchowe funkcje ElementArrayFinder i ich opisy

Poniżej przedstawiono funkcje ElementArrayFinder -

element.all(locator).clone

Jak sama nazwa wskazuje, funkcja ta utworzy płytką kopię tablicy elementów, czyli ElementArrayFinder.

element.all(locator).all(locator)

Ta funkcja w zasadzie zwraca nowy element ElementArrayFinder, który może być pusty lub zawierać elementy potomne. Można go używać do wybierania wielu elementów jako tablicy w następujący sposób

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)

Jak sama nazwa wskazuje, po zastosowaniu funkcji filtrującej do każdego elementu w ElementArrayFinder, zwraca nowy ElementArrayFinder ze wszystkimi elementami, które przechodzą przez funkcję filtrującą. Zasadniczo ma dwa argumenty, pierwszy to ElementFinder, a drugi to indeks. Może być również używany w obiektach stron.

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)

Dzięki temu możemy pobrać element w ElementArrayFinder według indeksu. Zauważ, że indeks zaczyna się od 0, a indeksy ujemne są zawijane.

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

Jak sama nazwa wskazuje, spowoduje to uzyskanie pierwszego elementu elementu ElementArrayFinder. Nie pobierze podstawowego elementu.

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

Jak sugeruje nazwa, spowoduje to pobranie ostatniego elementu elementu ElementArrayFinder. Nie pobierze podstawowego elementu.

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)

Służy do znajdowania tablicy elementów w obrębie rodzica, gdy wywołania $$ mogą być połączone.

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

Jak sama nazwa wskazuje, policzy to liczbę elementów reprezentowanych przez ElementArrayFinder. Nie pobierze podstawowego elementu.

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

Dopasuje elementy do szukacza. Może zwrócić prawdę lub fałsz. Prawda, jeśli są jakieś elementy, które pasują do wyszukiwarki i False w przeciwnym razie.

Example

expect($('.item').isPresent()).toBeTruthy();

element.all(locator).locator

Jak sama nazwa wskazuje, zwróci najbardziej odpowiedni lokalizator.

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)

Pobierze elementy reprezentowane przez 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)

Jak sama nazwa wskazuje, wywoła funkcję wejściową na każdym ElementFinder reprezentowanym przez 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)

Jak sugeruje nazwa, zastosuje funkcję mapy do każdego elementu w ElementArrayFinder. Ma dwa argumenty. Pierwszym byłby ElementFinder, a drugim indeks.

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)

Jak sama nazwa wskazuje, zastosuje funkcję redukuj do akumulatora i każdego elementu znalezionego za pomocą lokalizatora. Ta funkcja zredukuje każdy element do jednej wartości.

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

Jak sama nazwa wskazuje, oceni dane wejściowe, czy znajduje się w zakresie bieżących elementów bazowych, czy nie.

Example

View

<span class = "foo">{{letiableInScope}}</span>

Code

let value = 
element.all(by.css('.foo')).evaluate('letiableInScope');

element.all(locator).allowAnimations

Jak nazwa sugeruje, określi, czy animacja jest dozwolona na bieżących elementach bazowych, czy nie.

Example

element(by.css('body')).allowAnimations(false);

Tworzenie łańcuchów funkcji ElementFindera i ich opisy

Tworzenie łańcuchów funkcji ElementFindera i ich opisy -

element(locator).clone

Jak sama nazwa wskazuje, ta funkcja utworzy płytką kopię elementu ElementFinder.

element(locator).getWebElement()

Zwróci WebElement reprezentowany przez ten element ElementFinder, a błąd WebDriver zostanie zgłoszony, jeśli element nie istnieje.

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)

Znajdzie tablicę elementów w obrębie rodzica.

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)

Znajdzie elementy w rodzicu.

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)

Znajdzie tablicę elementów wewnątrz rodzica, gdy wywołania $$ mogą zostać połączone.

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)

Znajdzie elementy wewnątrz rodzica, gdy wywołania $ mogą być połączone.

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

Określa, czy element jest prezentowany na stronie, czy nie.

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

Działa tak samo jak element (lokalizator) .isPresent (). Jedyną różnicą jest to, że sprawdzi, czy element zidentyfikowany przez sublokator jest obecny, a nie bieżąca wyszukiwarka elementów.

element.all(locator).evaluate

Jak sama nazwa wskazuje, oceni dane wejściowe, czy są one związane z zakresem obecnych elementów bazowych, czy nie.

Example

View

<span id = "foo">{{letiableInScope}}</span>

Code

let value = element(by.id('.foo')).evaluate('letiableInScope');

element(locator).allowAnimations

Jak sama nazwa wskazuje, określi, czy animacja jest dozwolona na bieżących elementach bazowych, czy nie.

Example

element(by.css('body')).allowAnimations(false);

element(locator).equals

Jak sama nazwa wskazuje, będzie porównywać element równości.

Lokalizatory (według) API

Jest to po prostu zbiór strategii lokalizatora elementów, który zapewnia sposoby znajdowania elementów w aplikacjach Angular poprzez wiązanie, modelowanie itp.

Functions and their descriptions

Funkcje interfejsu API ProtractorLocators są następujące -

by.addLocator(locatorName,fuctionOrScript)

Doda lokalizator do tej instancji ProtrcatorBy, którego można następnie użyć z elementem (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

Jak sama nazwa wskazuje, znajdzie element poprzez powiązanie tekstu. Zostanie wykonane częściowe dopasowanie, tak aby wszystkie elementy powiązane ze zmiennymi zawierającymi ciąg wejściowy zostały zwrócone.

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

Jak sama nazwa wskazuje, znajdzie element poprzez dokładne powiązanie.

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)

Jak sama nazwa wskazuje, znajdzie element poprzez wyrażenie 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

Jak sama nazwa wskazuje, znajdzie przycisk po tekście.

Example

View

<button>Save</button>

Code

element(by.buttonText('Save'));

by.partialButtonText

Jak sama nazwa wskazuje, znajdzie przycisk według częściowego tekstu.

Example

View

<button>Save my file</button>

Code

element(by.partialButtonText('Save'));

by.repeater

Jak sama nazwa wskazuje, znajdzie element wewnątrz powtórzenia ng.

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

Jak sama nazwa wskazuje, znajdzie element po dokładnym przemienniku.

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

Jak nazwa sugeruje, znajdzie elementy zawierające dokładny ciąg według 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)

Jak sama nazwa wskazuje, znajdzie element za pomocą wyrażenia 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)

Jak nazwa sugeruje, znajdzie element za pomocą selektora CSS w 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);