0

找到元素 - 我試圖找到與此類似的元素 -硒 - 無法在第二次

Select servTypeDA = new Select (driver.findElement(By.xpath("//select[@id='ServicesType']"))); 
servTypeDA.selectByVisibleText(servTypeData); 

這是第一次完全正常工作,當我打開這個網頁。 我試圖做一個工作流,以便在幾個步驟後,這個頁面加載,對於在同一行,它拋出的錯誤 -

org.openqa.selenium.NoSuchElementException:找不到元素

但是我能夠看到屏幕中的元素,它的可見但仍然無法通過代碼訪問。 我試圖增加等待時間,仍然會引發錯誤。 爲什麼第二次不能訪問相同的元素?

回答

0

NoSuchElementwebdriver無法找到DOM中的元素時拋出。造成這種情況的主要原因很可能是你過早搜索元素。我會建議使用一些明確的等待,並定期檢查元素。

By byXpath = By.xpath("//select[@id='ServicesType']"); 
WebElement element = new WebDriverWait(driver,10).until(ExpectedConditions.visibilityOfElementLocated(byXpath)); 
Select servTypeDA = new Select(element); 
servTypeDA.selectByVisibleText(servTypeData); 
0

或者你可以設置implicitlyWait默認情況下爲0。 通過設置此,webdriver的等待時間一定量拋出NoSuchElementException異常

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 

之前,這將節省您的加入差不多的webdriverWait努力在每個元素之前。

0

webdriver的工作方式是每個頁面加載它複製頁面。所以顯示的內容不一定是在webdriver實例中加載的內容。例如,如果您通過JavaScript更改網頁,則webdriver不會意識到它。

這些往往是

的病程NoSuchElementException異常

StaleElementReferenceException

我發現,這樣做的唯一的治療方法是捕獲異常並嘗試再次。我必須爲每種類型的動作創建一個新的功能。我會告訴你我的例子中爲「selectByVisibleText」

public void selectByLabel(final By by, final String label){ 
act(by, 3, new Callable<Boolean>() { 
    public Boolean call() { 
    logger.trace("Trying to select label: "+label+" in select box "+stripBy(by)); 

    Boolean found = Boolean.FALSE; 
    int attempts = 0; 

    wait.until(ExpectedConditions.refreshed(ExpectedConditions.elementToBeClickable(by))); 

    Select select = new Select(driver.findElement(by)); 
    select.selectByVisibleText(label); 

    if(isLabelSelected(by,label)){ 
     found = Boolean.TRUE; // FOUND IT 
     logger.info("Selected value "+label+" in select box "+stripBy(by)); 
    } 

    return found; 
    } 
}); 

}

它會重試幾次。

我所有的行動的特殊implementetation使用功能,捕獲異常

private void act(By by, int tryLimit, boolean mode, Callable<Boolean> method){ 
logger.trace("Looking for element: " + stripBy(by)); 
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); 
boolean unfound = true; 
int tries = 0; 
while (unfound && tries < tryLimit) { 
    tries += 1; 
    try { 

    WebDriverWait wait = new WebDriverWait(driver, 500); 
    unfound = !method.call(); // FOUND IT, this is negated since it feel more intuitive if the call method returns true for success 
    } catch (StaleElementReferenceException ser) { 
    logger.error("ERROR: Stale element exception. " + stripBy(by)); 
    unfound = true; 
    } catch (NoSuchElementException nse) { 
    logger.error("ERROR: No such element exception. " + stripBy(by)+"\nError: "+nse); 
    unfound = true; 
    } catch (Exception e) { 
    logger.error(e.getMessage()); 
    } 
} 

driver.manage().timeouts().implicitlyWait(Constants.DEFAULT_IMPLICIT_WAIT, TimeUnit.SECONDS); 

if(unfound) 
    Assert.assertTrue(false,"Failed to locate element by locator " + stripBy(by)); 

}