Ali Mozafari
Ali Mozafari

Reputation: 3

NoSuchElementException can't be thrown

I'm trying to use an element for testing and I want to continue the test if the element even couldn't be found.

I used NoSuchElementException for this part of my codes.

Here is what I've tried before:

try {
    WebElement site_width_full_width = wait.until( 
            ExpectedConditions.visibilityOfElementLocated(
            By.cssSelector("label[for=site_width-full_width]")));
    site_width_full_width.click();

    Thread.sleep(1000);
    System.out.println("FullWidth Label Found!");

} catch (NoSuchElementException e) {
    System.out.println("FullWidth Label not found!");
    System.out.println(e);
}

But when the element isn't available it can't be thrown into the NoSuchElementException and all test breaks and fails.

What's the solution and how could I continue the test when the element isn't available.

Thanks in advance.

Upvotes: 0

Views: 595

Answers (4)

Nitin Sahu
Nitin Sahu

Reputation: 621

Webdriver already provide the way to deal this problem in much simpler way. you can use following way

 WebDriverWait wait= new WebDriverWait(driver, TimeSpan.FromSeconds(120));
    wait.IgnoreExceptionTypes(typeof(NoSuchElementException), typeof(ElementNotVisibleException));

 WebElement site_width_full_width = wait.until( 
            ExpectedConditions.visibilityOfElementLocated(
            By.cssSelector("label[for=site_width-full_width]")));
    site_width_full_width.click();

    Thread.sleep(1000);
    System.out.println("FullWidth Label Found!");

Note : You can add all types of exception need to be ignored.

Upvotes: 0

Ardesco
Ardesco

Reputation: 7441

You are catching a NoSuchElementException, but an explicit wait throws a TimeoutException if nothing is found. To get what you have working you should modify your code to do the following:

    try {
        WebElement site_width_full_width = wait.until(
                ExpectedConditions.visibilityOfElementLocated(
                        By.cssSelector("label[for=site_width-full_width]")
                ));
        site_width_full_width.click();
        System.out.println("FullWidth Label Found!");
    } catch (NoSuchElementException | TimeoutException e) {
        System.out.println("FullWidth Label not found!");
        System.out.println(e);
    }

However using Try/Catch for execution flow is generally a code anti-pattern. You would be much better off doing something like this:

    List<WebElement> site_width_full_width = 
            driver.findElements(By.cssSelector("label[for=site_width-full_width]"));
    if (site_width_full_width.size() > 0) {
        System.out.println("FullWidth Label Found!");
        site_width_full_width.get(0).click();
    } else {
        System.out.println("FullWidth Label not found!");
    }

Upvotes: 0

umair qayyum
umair qayyum

Reputation: 286

You might be getting the exception of a different derived class type. You can catch it using the parent class 'Exception' and then further drill down the exact exception type.

try using;

try
{
            WebElement site_width_full_width = wait.until(
                    ExpectedConditions.visibilityOfElementLocated(
                    By.cssSelector("label[for=site_width-full_width]")));
            site_width_full_width.click();

            Thread.sleep(1000);
            System.out.println("FullWidth Label Found!");

        }
        catch (Exception e)
        {
            if (e instanceof NoSuchElementException)
            {
                System.out.println("FullWidth Label not found!");
                System.out.println(e);
            }
            else
            {
                System.out.println("Unexpected exception!");
                System.out.println(e);
            }
        }

Hope this helps.

Upvotes: 1

Sreenivasulu
Sreenivasulu

Reputation: 514

You can try with its parent classes like Throwable or Exception in catch block. In my case, I am Throwable in catch block which works as expected

Upvotes: 1

Related Questions