The error message looks like this:
System.InvalidOperationException : unknown error: Element <... (html) ...> is not clickable at point (x, y). Other element would receive the click: <...(html)...>
Stack trace
at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
at OpenQA.Selenium.Remote.RemoteWebElement.Click()
Solution:
The clickable element is not ready, it might not be visible or clickable.
Sometimes the element is covered by another html element. (hide the covering element first).
Steps:
1. Wait for element to be visible
2. Wait for element to be clickable
3. Click with javascript
If this still this doesn’t work insert an implicit wait between step 1 and 2. (Thread.Sleep() in c#)
C# driver code to solve problems:
Wait for element to be visible and clickable (ElementToBeClickable = element is visible AND enabled.)
public IWebElement WaitUntilElementIsClickable(By findElementsBy)
{
var wait = new WebDriverWait(driver, timeoutForElementShouldBeVisibleInSeconds);
try
{
var element = wait.Until(ExpectedConditions.ElementToBeClickable(findElementsBy));
return element;
}
catch (Exception exception)
{
string message = exception.Message + " at findElementsBy " + findElementsBy.ToString();
Exception customException = new Exception(message, exception);
throw customException;
}
} public IWebElement WaitUntilElementIsClickable(By findElementsBy)
{
var wait = new WebDriverWait(driver, timeoutForElementShouldBeVisibleInSeconds);
try
{
var element = wait.Until(ExpectedConditions.ElementToBeClickable(findElementsBy));
return element;
}
catch (Exception exception)
{
string message = exception.Message + " at findElementsBy " + findElementsBy.ToString();
Exception customException = new Exception(message, exception);
throw customException;
}
}
Click with javascript:
public void ClickOnElement(string cssElementSelector)
{
string js = $"document.querySelector(\"{cssElementSelector}\").click()";
ExecuteJavascript(js);
}
public string ExecuteJavascript(string script)
{
return ExecuteJavascript<string>(script);
}
/// <summary>
/// Executes JavaScript in the context of the currently selected frame or window.
/// </summary>
/// <typeparam name="T">The converted return type</typeparam>
/// <param name="script">The JavaScript code to execute.</param>
/// <param name="args">The arguments to the script.</param>
/// <returns></returns>
public T ExecuteJavascript<T>(string script, object[] args = null)
{
IJavaScriptExecutor javaScriptExecutor = uiTests.Driver as IJavaScriptExecutor;
object result = null;
var wait = new WebDriverWait(uiTests.Driver, timeout: TimeSpan.FromMinutes(3));
wait.Until(ExpectedConditions.ElementIsVisible(By.TagName("body")));
result = javaScriptExecutor.ExecuteScript(script, args);
T typedResult = (T) result;
return typedResult;
}