Selenium WebDriver cannot click UTF-8 icons
In given example, there is a simple search form. Search value is cleared by “X” icon. This seems pretty forward case to be automated with Selenium WebDriver. It just seems! The element is properly located but when Selenium tries to click it an ElementNotVisibleException is thrown.
UTF-8 icon
When you inspect the code you can notice element is an empty SPAN. It has a UTF-8 icon displayed over it by CSS "content" property. With this approach, it is very easy to visualize vast amount of interesting icons without being proficient in image editing.Debug
I've set up very simple Selenium project for Visual Studio 2013 in my GitHub repository. On debug, the element can be located, but its width=0 so Selenium treats it as Displayed=false. This seems a good candidate for Selenium bug.// Locate element
IWebElement element = webDriver.FindElement(By.CssSelector("span.cancel"));
// Debug info
bool isDisplayed = element.Displayed; // false
int width = element.Size.Width; // 0
int heigth = element.Size.Height; // 17
Solve it
Problem solved with the execution of jQuery that will do the actual click of the element:// jQuery workaround of the click
((IJavaScriptExecutor)webDriver).
ExecuteScript("$('span.cancel').click()");
If jQuery is not available then try to do the click with a function of JavaScript library used by the application you are automating. If none is used they you can just use DOM JavaScript call:
((IJavaScriptExecutor)webDriver).
ExecuteScript("document.getElementsByClassName('cancel')[0].click();");
Bonus
There is one more interesting thing about jQuery. You can execute jQuery with some specific selector logic and this will return the same IWebElement if you have located it with WebDriver.// Locate element with jQuery
element = (IWebElement)((IJavaScriptExecutor)webDriver).
ExecuteScript("return $('span.cancel')[0]");
One small detail - [0] is needed at the end of jQuery code otherwise a jQuery object is returned and Selenium is not able to cast it to IWebElement. And of course, the element is yet not clickable. I’m just giving an alternative way of locating elements if Selenium way gets too complicated.