2013-11-22 118 views
7

我試圖檢查元素是否存在,我纔可以執行此行:檢查是否存在元素 - 硒/ JavaScript的/節點JS

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

這將引發錯誤「沒有這樣的元素」如果文檔中不存在id test,即使在try-區塊中。 我找到了Java的答案,您可以檢查大小是否爲0,但是在node-js中,在檢查大小之前會拋出錯誤。

throw error; ^ NoSuchElementError: no such element

+0

你不能只用這個:if(webdriver.By.id('test')){driver.findElement(webdriver.By.id('test')); }。 – JeffreyZ

+0

findElements()和size() – epascarello

+0

@ user2389688 webdriver.by.id(「anything」)似乎總是導致true。 –

回答

24

您可以利用的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); 
     } 
    }); 

我找不到它的文件中明確規定,但在webdriver/promise.jsselenium-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

這應該是被接受的答案,因爲它是唯一演示如何確定是否存在使用NodeJS Web驅動程序的元素。 – mcranston18

+2

除非操作系統誤用python而不是javascript,否則這應該是正確的答案。投票! – mekdev

+0

在我的情況下,'err'對象沒有「狀態」道具。它會返回這個,如果我控制檯登錄錯誤'{NoSuchElementError:沒有這樣的元素:無法找到元素:{「method」:「css selector」,「selector」:「img」}'。第二個條件返回'TypeError:無法讀取未定義的'承諾' – RZKY

-2

聽起來像是你要檢查是否存在你的屬性,第一:

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

如預期所選擇的答案沒有工作(err.stateundefinedNoSuchElementError總是拋出) - 儘管使用可選回調的概念,仍然有效。

由於我得到的是與OP引用相同的錯誤,因此在確定目標元素是否存在時,我認爲應該引用NoSuchElementError。因爲它的名字暗示的是元素不存在時拋出的錯誤。所以在errorCallback的條件應該是:

err instanceof webdriver.error.NoSuchElementError

所以完整的代碼塊將如下(我也是使用那些服用這種語法的優勢async/await):

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