2013-11-22 13 views
7

Sto cercando di verificare se un elemento esiste prima di poter eseguire questa linea:Controllare se l'elemento esiste - selenio/javascript/node-js

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

Questo genera un errore "tale elemento non" se l'ID test non esiste nel documento, anche in un blocco-try. Ho trovato risposte per Java, in cui è possibile verificare se la dimensione è 0, ma nel nodo-j questo genera un errore prima che possa controllare la dimensione.

throw error; ^ NoSuchElementError: no such element

+0

Non puoi usare questo: if (webdriver.By.id ('test')) {driver.findElement (webdriver.By.id ('test')); }. – JeffreyZ

+0

findElements() e size() – epascarello

+0

@ user2389688 webdriver.by.id ("qualsiasi cosa") sembra sempre risultare vero. –

risposta

24

è possibile sfruttare l'argomento opzionale gestore degli errori di 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); 
     } 
    }); 

non riuscivo a trovare esplicitamente dichiarato nella documentazione, ma determinata questo dalla definizione funzione nella webdriver/promise.js nella sorgente del modulo selenium-webdriver:

/** 
    * 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) { 
+3

Questa dovrebbe essere la risposta accettata in quanto è l'unica che dimostra come determinare se esiste un elemento utilizzando il NodeJS Web Driver. – mcranston18

+2

A meno che l'operazione non sia errata usando python non javascript, questa dovrebbe essere la risposta corretta. Up votato! – mekdev

+0

nel mio caso, l'oggetto 'err' non ha un puntello" stato ". restituisce questo se registro l'errore '{NoSuchElementError: no tale elemento: Impossibile trovare l'elemento: {" metodo ":" selettore css "," selettore ":" img "}'. e la seconda condizione restituisce 'TypeError: Impossibile leggere la proprietà 'promise' di undefined' – RZKY

-2

Suona come si desidera controllare se sono presenti le proprietà, in primo luogo:

if (webdriver.By.id) { 
    driver.findElement(webdriver.By.id('test')); 
} else { 
    console.error("Whoa, webdriver.By.id is not actually a function!"); 
} 
1

La risposta selezionata non ha funzionato come previsto (err.state era undefined e NoSuchElementError era sempre gettato) - anche se l'idea di utilizzare i callback opzionali funziona ancora.

Dal momento che stavo ottenendo lo stesso errore dell'OP fa riferimento, credo che NoSuchElementError dovrebbe essere referenziato quando si determina se l'elemento mirato esiste o meno. Come suggerisce il nome è l'errore che viene generato quando un elemento non esiste. Quindi la condizione nel errorCallback dovrebbe essere:

err instanceof webdriver.error.NoSuchElementError

Quindi il blocco di codice completo potrebbe essere il seguente (ho anche sto usando async/await per coloro che approfittando di che sintassi):

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 
Problemi correlati