Próbuję sprawdzić, czy istnieje element, zanim będę mógł wykonać tę linię:

driver.findElement(webdriver.By.id('test'));

To rzuca błąd "Brak takiego elementu" Jeśli identyfikator test nie istnieje w dokumencie, nawet w bloku try. Znalazłem odpowiedzi na Java, gdzie można sprawdzić, czy rozmiar ma 0, ale w Node-JS rzuca to błąd, zanim będę mógł sprawdzić rozmiar.

throw error; ^ NoSuchElementError: no such element

10
F. Rakes 22 listopad 2013, 19:45

5 odpowiedzi

Najlepsza odpowiedź

Możesz wykorzystywać opcjonalny argument obsługi błędów o then().

driver.findElement(webdriver.By.id('test')).then(function(webElement) {
        console.log('Element exists');
    }, function(err) {
        if (err.state && err.state === 'no such element') {
            console.log('Element not found');
        } else {
            webdriver.promise.rejected(err);
        }
    });

Nie mogłem znaleźć go wyraźnie określonego w dokumentacji, ale określono to z definicji funkcji w webdriver/promise.js w selenium-webdriver Źródło:

  /**
   * Registers a callback on this Deferred.
   * @param {Function=} opt_callback The callback.
   * @param {Function=} opt_errback The errback.
   * @return {!webdriver.promise.Promise} A new promise representing the result
   *     of the callback.
   * @see webdriver.promise.Promise#then
   */
  function then(opt_callback, opt_errback) { 
28
Zugwalt 7 styczeń 2014, 17:25

Dlaczego nie tylko użyj metody ISElementPresent (Locatororelement)? Oto link do kodu:

http://selenium.googlecode.com/git/docs/api/javascript/source/lib/webdriver/webdriver.js.src.html#l777.

3
Tomasz Wszelaki 9 maj 2014, 06:47

Wybrana odpowiedź nie działała zgodnie z oczekiwaniami ({X1}} była undefined i NoSuchElementError była zawsze rzucona) - choć koncepcja korzystania z opcjonalnych zwrotów zwrotnych wciąż działa.

Odkąd otrzymałem ten sam błąd, co OP jest odwołuje się, wierzę, że NoSuchElementError należy odwołać przy określaniu, jeśli elementowany element istnieje lub nie. Jako nazwa oznacza błąd, który jest rzucony, gdy element nie istnieje. Więc warunek w ErrorCallback powinien być:

err instanceof webdriver.error.NoSuchElementError

Więc pełny blok kodu byłby następujący (ja też używam async / await dla tych, którzy korzystają z tej składni):

var existed = await driver.findElement(webdriver.By.id('test')).then(function() {
    return true;//it existed
}, function(err) {
    if (err instanceof webdriver.error.NoSuchElementError) {
        return false;//it was not found
    } else {
        webdriver.promise.rejected(err);
    }
});
//handle value of existed appropriately here
2
Arthur Weborg 24 lipiec 2017, 15:00

Chcesz sprawdzić, czy istnieje element, zanim chcesz znaleźć element na UI. Możesz poczekać, aż element zostanie umieszczony na interfejsie użytkownika, możesz wykonać operację Element Znajdź.

Ex: Poniższy kod czeka, aż element znajduje się wówczas występuje element Znajdź.

driver.wait(webdriver.until.elementLocated(webdriver.By.id(LocatorValue)),20000)
.then(()=>{
   return driver.findElement(webdriver.By.id('test'));
}).then((element)=>{
    // Perform any operation what you to do.
      return element.click();
}).catch(()=>{
     console.log('Element not found');
})
0
Saurabh Bishnoi 23 lipiec 2018, 09:06

Wiem, że jest trochę późno, ale jest to kod, który pracował dla mnie.

var assert = require('assert');
var expect = require('chai').expect;
var should = require('chai').should();
var chai = require('chai');
var chaiAsPromised = require('chai-as-promised');

chai.use(chaiAsPromised);
chai.should();

var webdriver = require('selenium-webdriver');
By = webdriver.By;
until = webdriver.until;

describe('checking if an element id exists', function() {

  it.only('element id exists', function () {
    var driver = new webdriver.Builder().forBrowser('chrome').build();
    driver.get('http://localhost:3000');
    this.timeout(6000);

    return driver.wait(until.elementLocated(By.id('idWeWantToTest')), 5 * 1000).then( (e) => {
    }, function(err) {
      throw {
        msg: "element not found"
      }
    }).then( () => {
      driver.quit();
    });     
  });
})
0
Nikhil Das Nomula 29 wrzesień 2018, 07:17