J91
J91

Reputation: 55

Selenium, Java, if-else statement not working properly, NoSuchElementException

I am creating a simple selenium/junit test that is designed to take excel data and append the data to the end of a URL string. I have a written a for-loop that is supposed to run through all of the data located in a specific sheet. It is supposed to close current browser window after the loop is completed, and launch another browser session at the beginning of the next iteration.

The first 8 loops run fine, but the test ends and throws a "NoSuchElementException", referencing the element from the first conditional "if" statement. The test should simply jump to the next conditional statement (else if), given that the element in the first conditional statement is not present.

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;


import Utility.ExcelUtils;

public class TestClass extends Work{

    WebDriver driver;
    ExcelUtils excel;
    String[] dataArray;
    int dataArraySize;


@Before
public void testSetup() throws Exception { 

    System.setProperty("webdriver.chrome.driver", "C:\\Users\\jkohout\\Documents\\Drivers\\chromedriver1.exe");

    driver = new ChromeDriver();

    excel = new ExcelUtils();

    excel.setExcelFile("C:\\Users\\jkohout\\Documents\\JEMSAPITEST\\TestCases.xlsx", "Decoded");


    dataArray = new String[1039];

    dataArraySize = dataArray.length;
}

@Test
public void testDataRun() throws Exception {

        for(int i=0; i < 1040; i++ ) {

            String testCase1 = ExcelUtils.getCellData(i, 0); 

            driver.get(attUrlString+testCase1);

            Thread.sleep(2000);


            if(driver.findElement(By.xpath("//*[@id='javascriptEnabled']/div/div/img")).isDisplayed()) {

                System.out.println("404 page not found: Pass!: " + i);
                System.out.println(dataArraySize);




            } else if (driver.findElement(By.cssSelector("input[id='ct100_masterBody_btnNew']")).isDisplayed()) {

                System.out.println("Normal Display: Pass!: " + i);
                System.out.println(dataArraySize);



            } else {

                System.out.println("Fail: " + i);
                System.out.println(dataArraySize);
            }

        }



}

@After
public void closeTest() {

    driver.quit();
}

}

Here is the stack trace:

    org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id='javascriptEnabled']/div/div/img"}
  (Session info: chrome=67.0.3396.99)
  (Driver info: chromedriver=2.40.565498 (ea082db3280dd6843ebfb08a625e3eb905c4f5ab),platform=Windows NT 10.0.17134 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 0 milliseconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '3.12.0', revision: '7c6e0b3', time: '2018-05-08T15:15:08.936Z'
System info: host: 'JKOHOUT-LT', ip: '10.10.100.126', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_171'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false, acceptSslCerts: false, applicationCacheEnabled: false, browserConnectionEnabled: false, browserName: chrome, chrome: {chromedriverVersion: 2.40.565498 (ea082db3280dd6..., userDataDir: C:\Users\jkohout\AppData\Lo...}, cssSelectorsEnabled: true, databaseEnabled: false, handlesAlerts: true, hasTouchScreen: false, javascriptEnabled: true, locationContextEnabled: true, mobileEmulationEnabled: false, nativeEvents: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: XP, platformName: XP, rotatable: false, setWindowRect: true, takesHeapSnapshot: true, takesScreenshot: true, unexpectedAlertBehaviour: , unhandledPromptBehavior: , version: 67.0.3396.99, webStorageEnabled: true}
Session ID: dc93688301cb42d466343c51a9771426
*** Element info: {Using=xpath, value=//*[@id='javascriptEnabled']/div/div/img}
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:214)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:166)
    at org.openqa.selenium.remote.http.JsonHttpResponseCodec.reconstructValue(JsonHttpResponseCodec.java:40)
    at org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:80)
    at org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:44)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:543)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:317)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:419)
    at org.openqa.selenium.By$ByXPath.findElement(By.java:353)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:309)
    at Test.TestClass.testDataRunDecoded(TestClass.java:49)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)

Upvotes: 2

Views: 1452

Answers (2)

cruisepandey
cruisepandey

Reputation: 29362

Just replace these line of code :

if(driver.findElement(By.xpath("//*[@id='javascriptEnabled']/div/div/img")).isDisplayed()) {
     System.out.println("404 page not found: Pass!: " + i);
     System.out.println(dataArraySize);
 }  

else if (driver.findElement(By.cssSelector("input[id='ct100_masterBody_btnNew']")).isDisplayed()) {
     System.out.println("Normal Display: Pass!: " + i);
     System.out.println(dataArraySize);  
}  

To:

int size1 = driver.findElements(By.xpath("//*[@id='javascriptEnabled']/div/div/img")).size();
   if(size1>0) {
             System.out.println("404 page not found: Pass!: " + i);
             System.out.println(dataArraySize);   
         }

int size2 =  driver.findElements(By.cssSelector("input[id='ct100_masterBody_btnNew']")).size();
   if(size2>0) {
            System.out.println("Normal Display: Pass!: " + i);
            System.out.println(dataArraySize);
            }  

Explanation :

Just replace findElement() to findElements(). Note that findElements() would return you a list and then you can proceed further in your code if the size of list is more than 1 . I must say that It'd be a workaround. cause if no elements are present then findElements() would wait till the time you have specified in the implicit wait.

Hope this will be helpful.

Upvotes: 2

Andrei
Andrei

Reputation: 5637

Replace:

Thread.sleep(2000);
if(driver.findElement(By.xpath("//*[@id='javascriptEnabled']/div/div/img")).isDisplayed()) {
    System.out.println("404 page not found: Pass!: " + i);
    System.out.println(dataArraySize);
} else if (driver.findElement(By.cssSelector("input[id='ct100_masterBody_btnNew']")).isDisplayed()) {

with:

Thread.sleep(2000);
List<WebElement> list = driver.findElements(By.xpath("//*[@id='javascriptEnabled']/div/div/img"));
if(!list.isEmpty() && list.get(0).isDisplayed()) {
  System.out.println("404 page not found: Pass!: " + i);
  System.out.println(dataArraySize);
} else if (driver.findElement(By.cssSelector("input[id='ct100_masterBody_btnNew']")).isDisplayed()) {

The idea is not to find a single element, but a list of elements. If no elements will be found we will get an empty list, but in this case no exception will be thrown.

Upvotes: 1

Related Questions