Selenium Issue with Internet Explorer : org.openqa.selenium.NoSuchElementException : Unable to find element with xpath

738 views Asked by At

I am trying to run Selenium (Selenium standalone server 3.141.59) for my system in Internet Explorer (IE 11). It works till the login.

After the login it opens a new window and I use following line to open the desired page.

driver.get("http://appurl/function1.jsp");

After that I cant find any elements, not even by xpath as I get this error below.

org.openqa.selenium.NoSuchElementException : Unable to find element with xpath == //input[@value='Continue']

  @BeforeClass(alwaysRun = true)
  public void setUp() throws Exception {
    DesiredCapabilities cap = DesiredCapabilities.internetExplorer();
    cap.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.DISMISS);
    InternetExplorerOptions opt = new InternetExplorerOptions();
    opt.merge(cap);
    System.setProperty("webdriver.ie.driver", "D:\\JavaProjects\\Test\\libs\\IEDriverServer.exe");
    driver = new InternetExplorerDriver(opt);
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
  }

Can someone help me out on this? Thank you very much in advance.


Update

I made following changes as suggested.

driver.get("http://appurl/function1.jsp");
// after login to system I navigate to the page in above URL
new WebDriverWait(driver, 40).until(ExpectedConditions.elementToBeClickable(By.xpath("//input[@value='Continue']"))).click();
// waiting for the button with value as 'Continue' to be clickable

But I found no success as the issues still remain.

I am also adding the log below.

RemoteTestNG] detected TestNG version 7.0.1
Started InternetExplorerDriver server (32-bit)
3.9.0.0
Listening on port 16289
Only local connections are allowed
Jan 25, 2021 4:07:44 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: W3C
FAILED: testLogintoImmunizationLive
org.openqa.selenium.TimeoutException: Expected condition failed: waiting for element to be clickable: By.xpath: //input[@value='Continue'] (tried for 40 second(s) with 500 milliseconds interval)
    at org.openqa.selenium.support.ui.WebDriverWait.timeoutException(WebDriverWait.java:95)
    at org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:272)
    at com.immunization.IMMtestLogin.testLogintoImmunizationLive(IMMtestLogin.java:65)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:134)
    at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:597)
    at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:173)
    at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
    at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:816)
    at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:146)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
    at java.util.ArrayList.forEach(ArrayList.java:1257)
    at org.testng.TestRunner.privateRun(TestRunner.java:766)
    at org.testng.TestRunner.run(TestRunner.java:587)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:384)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:378)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:337)
    at org.testng.SuiteRunner.run(SuiteRunner.java:286)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1187)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1109)
    at org.testng.TestNG.runSuites(TestNG.java:1039)
    at org.testng.TestNG.run(TestNG.java:1007)
    at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
Caused by: org.openqa.selenium.NoSuchElementException: Unable to find element with xpath == //input[@value='Continue']
For documentation on this error, please visit: https://www.seleniumhq.org/exceptions/no_such_element.html
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:25:53'
System info: host: 'IT-PC-X', ip: 'IP_ADDRESS', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_201'
Driver info: org.openqa.selenium.ie.InternetExplorerDriver
Capabilities {acceptInsecureCerts: false, browserName: internet explorer, browserVersion: 11, javascriptEnabled: true, pageLoadStrategy: normal, platform: WINDOWS, platformName: WINDOWS, proxy: Proxy(), se:ieOptions: {browserAttachTimeout: 0, elementScrollBehavior: 0, enablePersistentHover: true, ie.browserCommandLineSwitches: , ie.ensureCleanSession: false, ie.fileUploadDialogTimeout: 3000, ie.forceCreateProcessApi: false, ignoreProtectedModeSettings: false, ignoreZoomSetting: false, initialBrowserUrl: http://localhost:16289/, nativeEvents: true, requireWindowFocus: false}, setWindowRect: true, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss}
Session ID: 8e60910f-bfeb-4580-92bb-ddd8e7d06c84
*** Element info: {Using=xpath, value=//input[@value='Continue']}
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49)
    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:552)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:323)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:428)
    at org.openqa.selenium.By$ByXPath.findElement(By.java:353)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:315)
    at org.openqa.selenium.support.ui.ExpectedConditions$7.apply(ExpectedConditions.java:205)
    at org.openqa.selenium.support.ui.ExpectedConditions$7.apply(ExpectedConditions.java:201)
    at org.openqa.selenium.support.ui.ExpectedConditions$22.apply(ExpectedConditions.java:641)
    at org.openqa.selenium.support.ui.ExpectedConditions$22.apply(ExpectedConditions.java:638)
    at org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:249)
    ... 29 more


===============================================
    Default test
    Tests run: 1, Failures: 1, Skips: 0
===============================================


===============================================
Default suite
Total tests run: 1, Passes: 0, Failures: 1, Skips: 0
===============================================
3

There are 3 answers

1
undetected Selenium On

As you are trying to interact with just after get() so to click() on the desired element you need to induce WebDriverWait for the elementToBeClickable() and you can use either of the following Locator Strategies:

  • cssSelector:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("input[value='Continue']"))).click();
    
  • xpath:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//input[@value='Continue']"))).click();
    

Reference

You can find a detailed discussion on NoSuchElementException in:

1
WKOW On

Probably you need to use wait function until continueInput element is clickable on DOM page. Code below;

continueInput = WebDriverWait(driver,40).until(EC.element_to_be_clickable((By.XPATH, '//input[@value='Continue']')))
0
undetected Selenium On

This error message...

Started InternetExplorerDriver server (32-bit)
3.9.0.0
Listening on port 16289
Only local connections are allowed
Jan 25, 2021 4:07:44 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: W3C
FAILED: testLogintoImmunizationLive
org.openqa.selenium.TimeoutException: Expected condition failed: waiting for element to be clickable: By.xpath: //input[@value='Continue'] (tried for 40 second(s) with 500 milliseconds interval)

...implies that the IEDriverServer was unable to locate the desired WebElement within the WebBrowsing Session i.e. InternetExplorer Browser session.

Your main issue is the incompatibility between the version of the binaries you are using as follows:

  • Though your Selenium standalone server version is 3.141.59 which is the latest released candidate.
  • But your InternetExplorerDriver version is 3.9.0.0.

So there is a clear mismatch between the Selenium standalone server v3.141.59 and InternetExplorerDriver v3.9.0.0. As per best practices as Selenium Client and InternetExplorerDriver are released in sync you must use both the binaries from the same release.


Additional Information

Further InternetExplorerDriver server v3.9.0.0 had a known issue as per the following references:

This issue have been addressed through the following commit:


Solution

Note: As per best practices as Selenium Client and InternetExplorerDriver are released in sync and you must try to use both the binaries from the same major release.

  • Clean your Project Workspace through your IDE and Rebuild your project with required dependencies only.
  • Execute your @Test.
  • Always invoke driver.quit() within tearDown(){} method to close & destroy the WebDriver and Web Client instances gracefully.