seleniumselenium-webdriverselenium-chromedrivergeckodriveriedriverserver

org.openqa.selenium.NoSuchElementException error in IE but the same code works fine in Chrome and Firefox


I have written a login script and when I execute it using ChromeDirver and FFDriver it works fine. But when I run the same using IE Driver it fails and giving the below error.

Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to find element with css selector == #mod\-login\-username
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: 'LENOVO', ip: '192.168.1.101', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_171'
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:39714/, nativeEvents: true, requireWindowFocus: false}, setWindowRect: true, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}}
Session ID: af1a703a-0216-4c67-8c51-1292d13e399c
*** Element info: {Using=id, value=mod-login-username}
    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.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:543)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:317)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementById(RemoteWebDriver.java:363)
    at org.openqa.selenium.By$ById.findElement(By.java:188)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:309)
    at pageObjects.Admin_Login.txtbx_Username(Admin_Login.java:13)
    at testcases.testcase01.main(testcase01.java:29)

Here is the script:-

package pageObjects;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

public class Admin_Login {

    private static WebElement element = null;

public static WebElement txtbx_Username(WebDriver driver) {

    element = driver.findElement(By.id("mod-login-username"));

    return element;
}

public static WebElement txtbx_Password (WebDriver driver) {

    element = driver.findElement(By.xpath("mod-login-password"));

    return element;
}

public static WebElement btn_Login (WebDriver driver) {

    element = driver.findElement(By.id("mod-login-password"));

    return element;
}
}

I'm not getting why the script showing the error of "Unable to find element with css selector ..." as I have only used id to find the element and not CSS selector. Could anyone please advise.


Solution

  • This error message...

    Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to find element with css selector == #mod\-login\-username 
    

    ...implies that the InternetExplorerDriver was unable to locate any element as per the Locator Strategy you have used.

    Reason

    As you have mentioned the same code works using ChromeDirver/Chrome and GeckoDriver/Firefox, it is worth to mention that different Browser Engine renders the HTML DOM differently. So brittle Locator Strategies may not work across all the browsers.


    As per your question, script showing the error of "Unable to find element with css selector ..." as I have only used id it is again worth to mention as per WebDriver W3C Editor's Draft the preferred Locator Strategies enlisted are as follows :

    Snapshot :

    Locator Strategies

    A change was propagated through the respective client specific bindings. For the Selenium-Java clients here is the client code where internally the Locator Strategies based on id, and name are internally converted to equivalent css selector through a switchcase as follows :

            switch (using) {
              case "class name":
                toReturn.put("using", "css selector");
                toReturn.put("value", "." + cssEscape(value));
                break;
    
              case "id":
                toReturn.put("using", "css selector");
                toReturn.put("value", "#" + cssEscape(value));
                break;
    
              case "link text":
                // Do nothing
                break;
    
              case "name":
                toReturn.put("using", "css selector");
                toReturn.put("value", "*[name='" + value + "']");
                break;
    
              case "partial link text":
                // Do nothing
                break;
    
              case "tag name":
                toReturn.put("using", "css selector");
                toReturn.put("value", cssEscape(value));
                break;
    
              case "xpath":
                // Do nothing
                break;
            }
            return toReturn;

    Snapshot :

    JAVA_classname_id_name_tagname

    Hence though you provide:

    (By.id("mod-login-username"))
    

    Error shows:

    Unable to find element with css selector == #mod\-login\-username