Odpowiedz

28

Wszystkie działają w podobny sposób z subtelnymi różnicami. Oto kilka różnic, które znalazłem -

elm.isPresent() -

  1. jest przedłużeniem ElementFinder i tak waits for Angular na osiedlenie się na stronie przed wykonaniem jakichkolwiek działań.
  2. Działa, gdy elm jest element(locator) lub ElementFinder, a nie . Jeśli zwróconych jest wiele elementów za pomocą podanego locator, pierwszy element jest sprawdzany, jeśli jest w DOM. Nie przyjmuje żadnych parametrów jako danych wejściowych.
  3. Działa najlepiej ze stronami kątowymi i elementami kątowymi.
  4. Pierwsza preferencja do użycia, gdy zachodzi potrzeba znalezienia elementu.

elm.isElementPresent(subLoc) - (Gdy jest lokalizator sub do elm)

  1. jest przedłużeniem ElementFinder i tak czeka kątowa na osiedlenie się na stronie przed wykonaniem jakichkolwiek działań.
  2. Służy do sprawdzania obecności elementów będących elementami podrzędnymi jednostki nadrzędnej. Dla parametru elm wymagany jest parametr sub locator. (jedyna różnica między tym i elm.isPresent()) działa najlepiej w przypadku stron kątowych i elementów kątowych.
  3. Pierwsza preferencja do użycia, gdy zachodzi potrzeba sprawdzenia, czy podrzędny element elementu macierzystego jest obecny.

browser.isElementPresent(element || Locator) -

  1. jest implementacją webdriver a więc nie czekać na kątowe do rozliczenia.
  2. Jako parametr przyjmuje parametr locator lub element i używa pierwszego wyniku, jeśli zlokalizowanych jest wiele elementów przy użyciu tego samego lokalizatora.
  3. Najlepiej stosować do stron nieaglastycznych.
  4. Pierwsza preferencja do użycia podczas testowania na stronach nieobrotowych.

Wszystkie powyższe kontrole dotyczące obecności elementu w DOM i zwracają wynik boolean. Chociaż cechy kątowe i niekątne nie wpływają na użycie tych metod, ale dodatkowa korzyść występuje, gdy metoda czeka domyślnie na osiowanie i pomaga uniknąć błędów w przypadku nie znalezienia elementu kątowego lub wyjątku odniesienia elementu stanu, etc ...

+0

Takiej właśnie odpowiedzi mam nadzieję uzyskać. Dziękuję Ci bardzo! Uważam, że te 3 sposoby sprawdzania obecności są dość mylące, ponieważ istnieją faktycznie różnice między metodami i niejasne jest, jakie są różnice, po prostu patrząc na to, jak nazywa się te metody. Ponadto różnice nie są odpowiednio udokumentowane. Mam nadzieję, że ta odpowiedź wypełniła lukę i pomogłaby innym w przyszłości. – alecxe

4

Nie mogę mówić, który jest preferowany, ale udało mi się znaleźć kod źródłowy i go zbadać.

Zgodnie z dokumentami, elm.isPresent() i elm.isElementPresent() są równoważne. Nadzieja, która pomaga.

Protractor API Docs

Jest link do View code tuż na prawo od tytułu.

browser.isElementPresent (wiąz);

https://angular.github.io/protractor/#/api?view=webdriver.WebElement.prototype.isElementPresent

/** 
* Schedules a command to test if there is at least one descendant of this 
* element that matches the given search criteria. 
* 
* @param {!(webdriver.Locator|webdriver.By.Hash|Function)} locator The 
*  locator strategy to use when searching for the element. 
* @return {!webdriver.promise.Promise.<boolean>} A promise that will be 
*  resolved with whether an element could be located on the page. 
*/ 
webdriver.WebElement.prototype.isElementPresent = function(locator) { 
    return this.findElements(locator).then(function(result) { 
    return !!result.length; 
    }); 
}; 

elm.isPresent();

https://angular.github.io/protractor/#/api?view=ElementFinder.prototype.isPresent

/** 
* Determine whether the element is present on the page. 
* 
* @view 
* <span>{{person.name}}</span> 
* 
* @example 
* // Element exists. 
* expect(element(by.binding('person.name')).isPresent()).toBe(true); 
* 
* // Element not present. 
* expect(element(by.binding('notPresent')).isPresent()).toBe(false); 
* 
* @return {ElementFinder} which resolves to whether 
*  the element is present on the page. 
*/ 
ElementFinder.prototype.isPresent = function() { 
    return this.parentElementArrayFinder.getWebElements().then(function(arr) { 
    if (arr.length === 0) { 
     return false; 
    } 
    return arr[0].isEnabled().then(function() { 
     return true; // is present, whether it is enabled or not 
    }, function(err) { 
     if (err.code == webdriver.error.ErrorCode.STALE_ELEMENT_REFERENCE) { 
     return false; 
     } else { 
     throw err; 
     } 
    }); 
    }, function(err) { 
    if (err.code == webdriver.error.ErrorCode.NO_SUCH_ELEMENT) { 
     return false; 
    } else { 
     throw err; 
    } 
    }); 
}; 

elm.isElementPresent();

https://angular.github.io/protractor/#/api?view=ElementFinder.prototype.isElementPresent

/** 
* Same as ElementFinder.isPresent(), except this checks whether the element 
* identified by the subLocator is present, rather than the current element 
* finder. i.e. `element(by.css('#abc')).element(by.css('#def')).isPresent()` is 
* identical to `element(by.css('#abc')).isElementPresent(by.css('#def'))`. 
* 
* @see ElementFinder.isPresent 
* 
* @param {webdriver.Locator} subLocator Locator for element to look for. 
* @return {ElementFinder} which resolves to whether 
*  the subelement is present on the page. 
*/ 
ElementFinder.prototype.isElementPresent = function(subLocator) { 
    if (!subLocator) { 
    throw new Error('SubLocator is not supplied as a parameter to ' + 
     '`isElementPresent(subLocator)`. You are probably looking for the ' + 
     'function `isPresent()`.'); 
    } 
    return this.element(subLocator).isPresent(); 
}; 
+1

Ktokolwiek zignorował to, powiedz nam dlaczego, odpowiedź wygląda mi dobrze. – Ardesco

+3

Myślę, że downvotes są po prostu kopiowanie wklejanie kodu źródłowego bez wyjaśnienia czegokolwiek. –

+0

Nie przegłosowano, ale też nie przegłosowano. Sądzę, że Michael ma rację co do przyczyn. Dziękujemy za udział i zaglądanie w to! – alecxe

-3

Można sprawdzić, czy element jest obecny, czy nie za pomocą funkcji isPresent.

Tak Twój kod byłoby coś jak:

var myElement = element(by.css('.elementClass')); 
expect(myElement.isPresent()).toBeFalsy(); 

Here jest docs kątomierz dla funkcji isPresent.

+3

Dzięki! Na tym polega problem - w kątomierzu są na to 3 sposoby i na tym właśnie polega pytanie. – alecxe