How can I solve the exception - Selenium element not interactable?

2.1K    Asked by AngelaBaker in QA Testing , Asked on May 9, 2022
driver.FindElement(By.Id("UserName")).SendKeys("test");
driver.FindElement(By.Id("Password")).SendKeys("test123");       
driver.FindElement(By.XPath("//*[@id="btnSubmit"]")).Click();

Also I'm using ImplicitWait command, thread and still facing the issue

Answered by Anil Jha

ElementNotInteractableException: Selenium Element not interactable by keyboard


Element is not reachable by keyboard in plain words means that the element can’t be reached using the keyboard, which means you won't physically interact with it even. Reason There can be multiple reasons behind the error Element is not reachable by keyboard which can be either of the following:

The element is hidden as modern JavaScript-centric UI styles always keep the ugly raw HTML input field hidden. The hidden attribute could have been implemented through either of the following ways: A temporary overlay of some other element over the desired element. A permanent overlay of some other element over the desired element. Presence of attributes e.g. class="ng-hide", style="display: none", etc As per best practices while sending character sequence, you must not attempt to invoke click() or sendKeys() on any

or tag, instead invoke click() on the desired tag following the Official locator strategies for the webdriver. Solution There are different approaches to address this issue. Incase of temporary overlay use WebDriverWait in conjunction with ExpectedConditions for the desired element to be visible/clickable as follows:

import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.ui.ExpectedConditions;
new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.XPath("//*[@id="btnSubmit"]"))).click();
In case of permanent overlay use executeScript() method from JavascriptExecutor interface as follows:
import org.openqa.selenium.JavascriptExecutor;
WebElement myElement = driver.findElement(By.XPath("//*[@id="btnSubmit"]"));
String js = "arguments[0].setAttribute('value','"+inputText+"')"
((JavascriptExecutor) driver).executeScript(js, myElement);


Your Answer

Answer (1)

The ElementNotInteractableException in Selenium typically occurs when an element is present in the DOM but is not in a state that can be interacted with. This can happen for several reasons, such as the element being hidden, not yet rendered, or overlapping with another element. Here are some strategies to resolve this issue:

1. Wait for the Element to be Interactable

Ensure that the element is ready for interaction. Use explicit waits to wait for conditions such as visibility or clickability.

Example using WebDriverWait:

  import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.support.ui.ExpectedConditions;import org.openqa.selenium.support.ui.WebDriverWait;WebDriver driver = // initialize your driverWebDriverWait wait = new WebDriverWait(driver, 10);WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("elementId")));element.click();

2. Check Element Visibility

Ensure that the element is visible on the page before interacting with it.

Example using visibilityOfElementLocated:

  WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("elementId")));element.click();

3. Scroll to the Element

Sometimes elements are not interactable because they are outside the visible viewport. Scrolling the element into view can help.

Example using JavaScriptExecutor:

  import org.openqa.selenium.JavascriptExecutor;WebElement element = driver.findElement(By.id("elementId"));JavascriptExecutor js = (JavascriptExecutor) driver;js.executeScript("arguments[0].scrollIntoView(true);", element);element.click();

4. Ensure the Element is Enabled

Ensure that the element is not disabled.

Example:

  WebElement element = driver.findElement(By.id("elementId"));if (element.isEnabled()) {    element.click();} else {    // handle the case where the element is disabled}

5. Handle Overlapping Elements

Sometimes other elements may overlap the target element, preventing interaction. In such cases, you might need to handle or close the overlapping elements first.

Example using Action class:

  import org.openqa.selenium.interactions.Actions;Actions actions = new Actions(driver);WebElement element = driver.findElement(By.id("elementId"));actions.moveToElement(element).click().perform();

6. Debugging and Additional Checks

Add debugging statements to confirm the element’s state and visibility.

Example:

  WebElement element = driver.findElement(By.id("elementId"));System.out.println("Element is displayed: " + element.isDisplayed());System.out.println("Element is enabled: " + element.isEnabled());

7. Alternative Interactions

If clicking on the element is not possible, consider alternative interactions such as sending keys to the element or using JavaScript to perform the click.

Example using JavaScript for click:

  JavascriptExecutor js = (JavascriptExecutor) driver;js.executeScript("arguments[0].click();", element);

Summary

To solve the ElementNotInteractableException in Selenium:

Wait for the Element to be Interactable: Use explicit waits like WebDriverWait to wait until the element is clickable or visible.

Check Element Visibility: Ensure the element is visible before attempting interaction.

Scroll to the Element: Use JavaScript to scroll the element into view.

Ensure the Element is Enabled: Check that the element is enabled.

Handle Overlapping Elements: Use actions to move to the element or close any overlapping elements.

Debugging and Additional Checks: Add debugging statements to confirm the element’s state.

Alternative Interactions: Use JavaScript to interact with the element if necessary.

By applying these techniques, you can handle most scenarios where an element is not interactable in Selenium.








5 Months

Interviews

Parent Categories