我在使用Java的Selenium WebDriver中編寫了很少的測試用例,並在網格(集線器和多個節點)上執行它們。我注意到一些測試用例因NoSuchElementException
而失敗。什麼是避免NoSuchElementException
並確保始終可以找到該元素的最佳方法?在Selenium中避免NoSuchElementException的最佳方法是什麼?
13
A
回答
23
你永遠不能確定該元素將被發現,實際上這是功能測試的目的 - 告訴你,如果你的網頁上有任何改變。但有一兩件事肯定是有幫助的,增加了對元素等待這往往造成NoSuchElementException
像
WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>));
4
你也可以用FluentWait
,
每個FluentWait
實例定義的最長時間等待條件,以及檢查條件的頻率。
此外,用戶可以配置等待,以在等待期間忽略特定類型的例外,例如在頁面上搜索元素時的NoSuchElementExceptions
。
// Waiting 30 seconds for an element to be present on the page, checking
// for its presence once every 5 seconds.
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, SECONDS)
.pollingEvery(5, SECONDS)
.ignoring(NoSuchElementException.class);
WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(By.id("foo"));
}
});
3
我完全同意彼得Mensik上方。你永遠不能說元素是否存在。 你應該清楚地理解它何時發生。從我的經驗,我應該說,它的原因如下情況發生的原因:
- 1)頁仍然被渲染,你已經完成了你的 元搜索和獲取任何元素例外。
- 2)第二個原因是AJAX還沒有回來,你已經 獲得
NoSuchElementException
- 3)第三個是最明顯的:元素是真的不 只要在網頁上。
因此,使用一個函數調用來處理所有這三個條件的最強大的IMHO方式是使用如Amith003建議的fluentWait
。
,使代碼如下所示:
讓基本元素有定位:
String elLocXpath= "..blablabla";
WebElement myButton= fluentWait(By.xpath(elLocXpath));
myButton.click();
public WebElement fluentWait(final By locator){
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(org.openqa.selenium.NoSuchElementException.class);
WebElement foo = wait.until(
new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(locator);
}
}
);
return foo;
};
此外,如果你的目的是健壯的代碼包fluentWait()
有try{} catch{}
塊。
而且不要忘了
public boolean isElementPresent(By selector)
{
return driver.findElements(selector).size()>0;
}
,這也是有益的。
因此總結所有提到的如果你想避免NoElement
異常只是正確處理,因爲沒有人可以確保頁面上的元素存在。
現在希望它更清晰。問候
1
WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds);
wait.until(ExpectedConditions.elementToBeClickable(By.id<locator>));
elementToBeClickable等待啓用元素的和可見
1
public WebElement fluientWaitforElement(WebElement element, int timoutSec, int pollingSec) {
FluentWait<WebDriver> fWait = new FluentWait<WebDriver>(driver).withTimeout(timoutSec, TimeUnit.SECONDS)
.pollingEvery(pollingSec, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class, TimeoutException.class);
for (int i = 0; i < 2; i++) {
try {
//fWait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//*[@id='reportmanager-wrapper']/div[1]/div[2]/ul/li/span[3]/i[@data-original--title='We are processing through trillions of data events, this insight may take more than 15 minutes to complete.']")));
fWait.until(ExpectedConditions.visibilityOf(element));
fWait.until(ExpectedConditions.elementToBeClickable(element));
}
catch (Exception e) {
System.out.println("Element Not found trying again - " + element.toString().substring(70));
e.printStackTrace();
}
}
return element;
}
0
我通常使用此行的主要功能
public static void main(String[] args) throws ParseException {
driver= new ChromeDriver();
driver.manage().window().maximize();
**driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);**
希望這有助於。
0
我們可以應用下面的代碼移除這一異常情況
通過其可見度的元件的施加WebDriverWait,對象的webdriver等待一個特定的時間(以秒計)。
WebDriverWait wait = new WebDriverWait(driver, 10); wait.until(ExpectedConditions.visibilityOf(link));
我們可以通用方法
public boolean isElementPresent(By by) { boolean isPresent = true; try { driver.findElement(by); } catch (NoSuchElementException e) { isPresent = false; } return isPresent }
http://selenium-code.blogspot.in/2017/08/selenium-exception-nosuchelementexcepti.html
相關問題
- 1. 什麼是避免Application.Current.Properties的硬編碼鍵的最佳方法?
- 2. 避免SpamCop觸發ASP.NET網頁的最佳方法是什麼?
- 3. 在Java中避免XPath注入攻擊的最佳方法是什麼?
- 4. 避免在Rails視圖中丟失時區的最佳方法是什麼?
- 5. 避免Selenium webdriver上的StaleElementReferenceException的最佳方法
- 6. 什麼是避免這種重複代碼的最佳方式
- 7. 避免sql注入的最佳方式是什麼?
- 8. 避免執行javascript的最佳方法
- 9. 避免假用戶的最佳方法
- 10. 避免違反LSP的最佳方法
- 11. Android - 什麼是避免隱藏軟鍵盤下的EditText的最佳方法
- 12. 什麼是避免在django中打開重定向的最佳方式
- 13. 避免代碼重複 - 最佳方法
- 14. 避免在pyspark代碼中使用collect()函數的最佳方法是什麼?編寫優化pyspark代碼的最佳方法是什麼?
- 15. 在Selenium中聲明重定向的最佳方式是什麼?
- 16. 什麼是使用Webdriver使用Selenium的最佳方法
- 17. 什麼是避免maven-jar的最好方法?
- 18. 什麼是避免angularjs中的命名衝突的最佳方式
- 19. 什麼是避免重複代碼的最佳設計?
- 20. 在SQL中避免重複子查詢的最佳方法
- 21. 在flex中避免http服務錯誤的方法是什麼?
- 22. 在Java中8避免NoSuchElementException異常流
- 23. ANTLR4的最佳方法是什麼?
- 24. 評論的最佳方法是什麼?
- 25. C# - 跟蹤和避免死亡事件的最佳方式是什麼
- 26. 與流避免NoSuchElementException異常
- 27. 在我的情況下避免幻數的最佳方法
- 28. 避免副作用的最佳做法
- 29. Android的最佳做法,以避免memoryleaks?
- 30. 避免「在數字eq(==)中不是數字的最佳方法」 - 警告
這有一定的幫助內通過try-catch塊處理NoSuchElementException異常。我們是否可以有一個通用的等待條件,以便我們不需要檢查使用哪個ExpectedConditions條件? –
也可以訪問'Webdriver API'提供的'隱式'等待,但是因爲這只是設置一個任意時間段'不做任何事情',非常類似於'sleep',所以鼓勵使用'顯式等待'如上所述的可靠性和速度。 –
這實際上是我從所有代碼示例中看到的最乾淨和最簡單的代碼。謝謝! – mkorman