2

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.

DebanjanB
  • 118,661
  • 30
  • 168
  • 217
Kaustubh
  • 478
  • 2
  • 18

1 Answers1

1

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 :

  • "css selector" : CSS selector
  • "link text" : Link text selector
  • "partial link text" : Partial link text selector
  • "tag name" : Tag name
  • "xpath" : XPath selector

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
DebanjanB
  • 118,661
  • 30
  • 168
  • 217
  • Thanks a bunch! But, I'm trying to performing crossbrowser tests. So how should i handle such scenarios as you explained that Browser Engine renders the HTML DOM differently. Is there a work around to this? How the tests should be written so that it will be accepted within all browsers. Thanks in Advance @DebanjanB – Kaustubh Jun 13 '18 at 10:51
  • 1
    @Kaustubh There won't be any deviation (significant difference) if your _Locator Strategies_ are optimized. – DebanjanB Jun 13 '18 at 10:53
  • Yes! I did. :) Sorry, but can you please help me or just give me idea to start with - how to optimise Locator Strategies. Thanks in Advance! @DebanjanB – Kaustubh Jun 13 '18 at 11:21
  • 1
    @Kaustubh Though my opinion will be based on expertise and experience but try using the `class` attribute as a mandatory measure coupled up with `id`, `name`, etc use the `tagName` exclusively. – DebanjanB Jun 13 '18 at 11:26
  • 1
    Great! Understood. Thanks for help. – Kaustubh Jun 13 '18 at 11:28