What is the best way to avoid NoSuchElementException in Selenium?

后端 未结 9 624
时光说笑
时光说笑 2020-11-27 18:31

I have written few test cases in Selenium WebDriver using Java and execute them on grid (hub and multiple nodes). I have noticed that a few test cases fail due to NoSu

相关标签:
9条回答
  • I completely agree to Petr Mensik above. The matter you can never say whether element is present. You should clearly understand why when it happens. From my experience I should say that it happens due to the following reasons:

    • 1) The page is still being rendered and you've already finished your element search and obtain no element exception.
    • 2) The second reason is AJAX has not returned yet and you've already obtain NoSuchElementException
    • 3) The third is most obvious: The element is really not on the page whenever.

    so the most robust IMHO way to handle all these three conditions using one function call is to use fluentWait as Amith003 suggested.

    so the code be the following:

    let ur element has the locator:

    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;
        };
    

    Also if your purpose is robust code wrap fluentWait() with a try{} catch{} block.

    Also don't forget about

     public boolean isElementPresent(By selector)
       {
    
                  return driver.findElements(selector).size()>0;
    }
    

    that is also useful.

    So to conclude all the mentioned if you want to avoid NoElement exception just handle it properly as nobody can ensure in the element presence on the page.

    Hope now it is more clear to you. Regards

    0 讨论(0)
  • 2020-11-27 19:21
    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 讨论(0)
  • 2020-11-27 19:21

    I usually use this line in the main function

    public static void main(String[] args) throws ParseException {
        driver= new ChromeDriver();
        driver.manage().window().maximize();
        **driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);**
    

    Hope this helps.

    0 讨论(0)
提交回复
热议问题