2014-06-23 65 views
1

場景:我有一個像登錄到某個頁面之後的場景,一個配置文件更新按鈕會間歇性出現,我需要單擊它。事情就像是如果那個按鈕會出現,我必須點擊否則我必須離開那個部分繼續前進。我寫了一個邏輯來處理下面的情況。Selenium:如何驗證元素是否存在

public boolean isElementPresent(By locatorKey) { 
try { 
getDriver().findElement(locatorKey); 
return true; 
} catch (org.openqa.selenium.NoSuchElementException e) { 
return false; 
} 
} 

如果該元素將出現,它將返回true,否則將返回false ..上面的代碼工作正常......但問題是,它正在圍繞一個分返回true或false ..假設我用五個地方在我的腳本,以便不必要我的劇本在等待5分鐘......我也曾嘗試下面的代碼

getDriver().findElement(locator).isDisplayed(); 

但我面臨着同樣的問題...代碼工作罰款,但它也需要大約1分鐘才能返回命令...

是是否有任何有效的方法來處理這種情況,而無需等待一分鐘才能獲得狀態?

+1

你在使用隱式等待嗎?換句話說,你的代碼中有一行代碼,看起來像'driver.manage()。timeouts()。implicitlyWait(60000)'?如果是這樣,那就是爲什麼你的等待需要很長時間才能返回。 – JimEvans

+1

該代碼不需要一分鐘。事實上,它可能會立即執行,然後返回false,因爲該元素尚未出現。你的問題可能在別的地方。 – MxyL

+0

隱含的等待在這裏聽起來是一個可行的罪魁禍首 – Arran

回答

2

使用方法findElements代替,並檢查返回的列表不是空的:

return !getDriver().findElements(locatorKey).isEmpty(); 

請注意,try/catch條款這裏不需要。

0

巴拉克馬諾斯有一個完全可行的回答你的問題,但如果你想避免布爾反轉,這裏是一個另類:

public boolean isElementPresent(By locatorKey){ 
    return (getDriver().findElements(locatorKey).size() > 0); 
} 

與他的解決方案,不需要的try/catch因爲findElements()只會返回一個空列表,如果找不到定位符或陳舊。

再一次,不要在這裏降低barak manos。這只是另一個解決方案。

+0

我最初使用'size()> 0'。然後有人寫我可以使用'isEmpty()',所以我認爲它是「語義上」更好。在兩種情況下,就正確性和性能而言,結果是相同的。不是那麼重要,但布爾反轉實際上發生在**你的解決方案**中。 –

+0

考慮到方法的上下文(isElementPresent,如果存在則爲真,否則爲假),我必須在反轉點上與您不一致。爲了在找到元素(並且列表不爲空)時返回true,必須使用!反轉布爾值。運營商。 .size()> 0僅當列表包含值時返回true,表示已找到一個或多個定位器實例。在這種情況下,這一切都歸結於優先。如果一個特定的方法適合你,可讀性和可管理性,那麼這是最好的方法。我只是想提出一個替代方案。 –

相關問題