I'm using Selenium.WebDriver for C# to ask a question on Quora just typing my question in notepad.
Everything worked fine since I had to post it.
To post it I need to click on a link inside a span like this:
<span id="__w2_wEA6apRq1_submit_question">
<a class="submit_button modal_action" href="#" id="__w2_wEA6apRq1_submit">Add Question</a>
</span>
In order to click it I've tried this method, that I've used for all my previous button clicks:
Selecting the element and clicking it:
var element = driver.FindElement(By.CssSelector(".submit_button.modal_action"));
element.Click();
Doing so I can get the element, but unfortunately it throws "ElementNotVisibleException". Debugging my application I could see that Displayed property was set to False, while it wasn't, because in my ChromeDriver I could clearly see the button.
To avoid clicking the element, I tried IJavaScriptExecutor and Driver.ExecuteJavaScript(); to click the link through a script:
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
js.ExecuteScript("arguments[0].click()", element);
Same logic has been used for Driver.ExecuteJavaScript(); but I get the same result, but when I write the same script into DevTools's Console tab it works perfectly.
How can I solve this issue?
You might have a case where the button become displayed(visible) after your check is executed, so you might try following delay in order to ensure that the button is displayed at the time of check:
public static void WaitForElementToBecomeVisibleWithinTimeout(IWebDriver driver,
IWebElement element, int timeout)
{
new WebDriverWait(driver,
TimeSpan.FromSeconds(timeout)).Until(ElementIsVisible(element));
}
private static Func<IWebDriver, bool> ElementIsVisible(IWebElement element)
{
return driver =>
{
try
{
return element.Displayed;
}
catch (Exception)
{
// If element is null, stale or if it cannot be located
return false;
}
};
}
If the button is not visible in the viewport(i.e. need scrolling to become visible) then you may scroll it with
public static void ScrollElementToBecomeVisible(IWebDriver driver, IWebElement element)
{
IJavaScriptExecutor jsExec = (IJavaScriptExecutor)driver;
jsExec.ExecuteScript("arguments[0].scrollIntoView(true);", element);
}
As per the HTML you have shared to click on the element with text as Add Question as the element is within a Modal Dialog you need to induce WebDriverWait for the desired ElementToBeClickable and you can use either of the following Locator Strategies as solutions:
LinkText:
new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.LinkText("Add Question"))).Click();
CssSelector:
new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("span[id$='_submit_question']>a.submit_button.modal_action"))).Click();
XPath:
new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//span[contains(#id,'_submit_question')]/a[#class='submit_button modal_action' and contains(.,'Add Question')]"))).Click();
Related
I'm using Selenium.WebDriver for C# to ask a question on Quora just typing my question in notepad.
Everything worked fine since I had to post it.
To post it I need to click on a link inside a span like this:
<span id="__w2_wEA6apRq1_submit_question">
<a class="submit_button modal_action" href="#" id="__w2_wEA6apRq1_submit">Add Question</a>
</span>
In order to click it I've tried this method, that I've used for all my previous button clicks:
Selecting the element and clicking it:
var element = driver.FindElement(By.CssSelector(".submit_button.modal_action"));
element.Click();
Doing so I can get the element, but unfortunately it throws "ElementNotVisibleException". Debugging my application I could see that Displayed property was set to False, while it wasn't, because in my ChromeDriver I could clearly see the button.
To avoid clicking the element, I tried IJavaScriptExecutor and Driver.ExecuteJavaScript(); to click the link through a script:
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
js.ExecuteScript("arguments[0].click()", element);
Same logic has been used for Driver.ExecuteJavaScript(); but I get the same result, but when I write the same script into DevTools's Console tab it works perfectly.
How can I solve this issue?
You might have a case where the button become displayed(visible) after your check is executed, so you might try following delay in order to ensure that the button is displayed at the time of check:
public static void WaitForElementToBecomeVisibleWithinTimeout(IWebDriver driver,
IWebElement element, int timeout)
{
new WebDriverWait(driver,
TimeSpan.FromSeconds(timeout)).Until(ElementIsVisible(element));
}
private static Func<IWebDriver, bool> ElementIsVisible(IWebElement element)
{
return driver =>
{
try
{
return element.Displayed;
}
catch (Exception)
{
// If element is null, stale or if it cannot be located
return false;
}
};
}
If the button is not visible in the viewport(i.e. need scrolling to become visible) then you may scroll it with
public static void ScrollElementToBecomeVisible(IWebDriver driver, IWebElement element)
{
IJavaScriptExecutor jsExec = (IJavaScriptExecutor)driver;
jsExec.ExecuteScript("arguments[0].scrollIntoView(true);", element);
}
As per the HTML you have shared to click on the element with text as Add Question as the element is within a Modal Dialog you need to induce WebDriverWait for the desired ElementToBeClickable and you can use either of the following Locator Strategies as solutions:
LinkText:
new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.LinkText("Add Question"))).Click();
CssSelector:
new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("span[id$='_submit_question']>a.submit_button.modal_action"))).Click();
XPath:
new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//span[contains(#id,'_submit_question')]/a[#class='submit_button modal_action' and contains(.,'Add Question')]"))).Click();
This question already has answers here:
Selenium Web Driver & Java. Element is not clickable at point (x, y). Other element would receive the click
(9 answers)
Closed 4 years ago.
Update: The main problem was that element icon hid a button and it was not clickable. Solution was, using js.Executor, to hide this icon.
I am trying to use Selenium WebDriver for tests, it is new for me, and I have a problem with one element, it is no clickable, I tried find it by linktext, classname, cssselector, it does not work.
I have already read a lot of about this issue "Element is not clickable" , but have not found solution for my test. Hope, you will give me good advice.
Chrome version 67.0.3396.99, 64 bit
Visual C# 2017
Webdriver version 3.13.1.0
Here is my script:
namespace MK_edit
{
class Program
{
static void Main(string[] args)
{
IWebDriver driver = new ChromeDriver(#"C:\Users\alina\ProjectLibre");
driver.Url = "http://test.test.com"; //not real url, I cannot show it
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(60);
driver.Manage().Window.Maximize();
//close popup
driver.FindElement(By.CssSelector("div.whatsnew-content"));
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
driver.FindElement(By.CssSelector("button.btn.btn-success")).Click();
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(60);
//edit part
var lab = driver.FindElement(By.CssSelector("span.glyphicon.glyphicon-edit"));
lab.Click();
}
}
}
Element info:
<li class="allwaysVisible"><span class="glyphicon glyphicon-edit"></span></li>
Error message:
Element <span class=\"glyphicon glyphicon-edit\">
</span> is not clickable at point (312, 24).
Other element would receive the click: <div class=\"modal-backdrop fade\">
</div>\n
Thank you!
As per error message you have shared, <div class=\"modal-backdrop fade\"> would recieve the click and not <span class=\"glyphicon glyphicon-edit\">. You cannot interract with your element until div element hovers your element. It means div, if it is a popup or dialogue, should be closed. Or if it is a element which automatically dissapears, you have to wait until this element will be not more visible. Then you can click on your element.
I cannot provide the code sample to solve your issue, since I don't have a link to website. Hope this helps.
Wait until the spinner/loader disappears, try passing the spinner element ".modal-backdrop" inside a method like this...
public static void WaitForNotVisible(IWebElement element, IWebDriver driver)
{
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.Until(drv =>
{
try
{
if (element.Displayed)
{
return false;
}
return true;
}
catch
{
return true;
}
});
}
Like this...
var spinnerElement = driver.FindElement(By.CssSelector(".modal-backdrop"));
WaitForNotVisible(spinnerElement, driver);
labosana.Click();
Please add some wait before finding the labosana element
Code:
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20));
wait.Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("span.glyphicon.glyphicon-edit")));
var labosana = driver.FindElement(By.CssSelector("span.glyphicon.glyphicon-edit"));
labosana.Click();
You may replace click event with action class,
Actions builder = new Actions(driver);
builder.MoveToElement("Your target element").Click().Perform();
My element became visible and clickable after such additions, tnx for advices
//open edit
var lab = driver.FindElement(By.CssSelector("a[title=\"---\"]"));
var icon = driver.FindElement(By.CssSelector("span.glyphicon.glyphicon-edit"));
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
js.ExecuteScript("arguments[0].style='display: none;'", icon);
var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 30));
wait.Until(ExpectedConditions.ElementToBeClickable(lab));
lab.Click();
How can I use click event in Selenium and C#
For example:
Go to Google Homepage.
Search the result Test
Click on the Search button, page change.
How can I get the new page?
Code Screenshot link: https://www.dropbox.com/s/23ih019wuczp3uv/Screenshot%202018-05-07%2011.08.38.png?dl=0
public void opengoogle()
{
ChromeOptions option = new ChromeOptions();
option.AddArgument("--headless");
ChromeDriver wd = new ChromeDriver(option);
try
{
wd.Navigate().GoToUrl("https://www.google.co.in/");
Thread.Sleep(2000);
wd.FindElement(By.CssSelector("#lst-ib")).Click();
Thread.Sleep(2000);
wd.FindElement(By.CssSelector("#lst-ib")).Click();
wd.FindElement(By.CssSelector("#lst-ib")).Clear();
wd.FindElement(By.CssSelector("#lst-ib")).SendKeys("Test");
}
finally { }
If you observe the HTML the desired element identified through By.CssSelector("#lst-ib"), it is within a <form> tag. So once you have sent the search text within the search field you can invoke Submit() method as follows :
wd.FindElement(By.CssSelector("#lst-ib")).Click();
wd.FindElement(By.CssSelector("#lst-ib")).Clear();
wd.FindElement(By.CssSelector("#lst-ib")).SendKeys("Test");
wd.FindElement(By.CssSelector("#lst-ib")).Submit();
My web page is little lengthy and the SAVE button is at the top right-hand corner. As I input the data through Protractor.NET, the webpage scrolls down which hides the SAVE button, thereby throwing a Element is not clickable at a point error. Now inorder to save the webpage, I need to scroll up and then find the SAVE button and click it.
I have an example in Protractor which uses window.scrollTo(0,0), but how do I implement the same in Protractor.NET
EDIT: Included code
public void Test()
{
var saveBtn = NgWebDriver
.FindElement(By.ClassName("btnSave"))
.FindElement(By.ClassName("Save"));
var btnSv = Scroller(saveBtn);
btnSv.Click();
}
public IWebElement Scroller(IWebElement element)
{
((IJavaScriptExecutor)NgWebDriver).ExecuteScript("arguments[0].scrollIntoView();", element);
return element;
}
So the exception occurs in Scroller method while casting the NgWebDriver to IJavaScriptExecutor type
How can I accomplish this?
Finally got the solution to scrolling up to the top in Protractor.NET
Had referred the link and was able to solve my problem.
The below code worked for me.
IWebDriver driver = MyWebDriver.WrappedDriver;
IJavaScriptExecutor jse = (IJavaScriptExecutor)driver;
jse.ExecuteScript("scroll(0, -250);");
Why do you want to make it complicated?
If you want to scroll to an element you can use this simple method:
public IWebElement ScrollToElement(IWebElement webElement)
{
((IJavaScriptExecutor)Driver).ExecuteScript("arguments[0].scrollIntoView();", webElement);
return webElement;
}
The below code helped me to achieve the same.
IJavaScriptExecutor jse = (IJavaScriptExecutor)NgDriver;
jse.ExecuteScript("arguments[0].scrollIntoView()", webElement);
I tried to find any solution but nothing is not helped me.
I have this element
<span data-lkd="GUI-411396" data-lkta="tc" data-lkda="title" class="panelbar_item" title="Hledat">Form</span>
In Selenium I find it with
IWebElement form = GetElementAndWaitForEnabled(By.CssSelector("span[data-lkd=\'GUI-411396\']"));
It's not problem to this part. But if try click on this element in IE11 nothing happend
find.Click()
I tried some solution like:
driver.SwitchTo().Window(driver.CurrentWindowHandle);
find.SendKeys(Keys.Enter);
find.Click();
But nothing happend. In Chrome and Firefox is normaly click on element.
If I clik in other elements for example button it works on IE 11. But I need click on this element.
I'm using Selenium v2.46.0, IE 11 (x86, x64).
With IE, it's always something extra you should do. Try this "special" trick:
IJavaScriptExecutor js = driver as IJavaScriptExecutor;
js.ExecuteScript("arguments[0].click();", find)
It looks like you are trying to click on a span element. Instead of using a work around to click on the span element and trying to get the desired effect, try checking to see if it is wrapped in an anchor element or input / button element.
As an aside a good practice is to remember to always scroll the element into view, an example wrapper function would be:
public static void clickElementAsUser(WebDriver driver, By by)
{
WebElement element;
try
{
element = driver.findElement(by);
scrollElementIntoView(driver, element);
Thread.sleep(100); //Wait a moment for the element to be scrolled into view
element.click();
}
catch(Exception e) //Could be broken into multicatch
{
//Do Something
}
}
public static void scrollElementIntoView(WebDriver driver, WebElement element)
{
try
{
((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView(true);", element);
}
catch(Exception e)
{
//Do Something
}
}
If you post a small code sample of what is aroudn the span I may be able to help further. Goodluck!