.Text not working in Selenium PhantomJS C# - c#

I want to get the text Sample from this structure:
<td id="IDName">Sample</td>
so I tried this:
driver1.FindElement(By.Id("IDName")).Text;
but it always return null.
Is there any reason why is it not working?

It's Hard to say why .Text is not working in your case, Might be possible when you are going to find element it's present on the DOM without text, So you should WebDriverWait to wait until element exists as below :-
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement element = wait.Until(ExpectedConditions.ElementExists(By.Id("IDName")));
element.Text;
Or might be possible it's designing issues of your HTML, then you can get text by using .GetAttribute("innerHTML") as below :-
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement element = wait.Until(ExpectedConditions.ElementExists(By.Id("IDName")));
element.GetAttribute("innerHTML");
Or then you can get text by using .GetAttribute("textContent") as below :-
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement element = wait.Until(ExpectedConditions.ElementExists(By.Id("IDName")));
element.GetAttribute("textContent");
Hope it helps...:)

Related

Explicit wait condition using C#

Is it possible to pass a IWebElement variable to an explicit wait condition instead of hard coding xpath values? Here is an example of what I'm trying to achieve. I would like to pass grant Email.GMSName variable as opposed to hard coding the xpath: /html/body/table/thead/tr/th[2]
try
{
WebDriverWait w = new WebDriverWait(Driver, TimeSpan.FromSeconds(20));
w.Until(ExpectedConditions.ElementExists(By.XPath(grantEmail.GMSName));
Assert.IsTrue(grantEmail.GrantNumber.Displayed);
Assert.IsTrue(grantEmail.GMSName.Displayed);
Assert.IsTrue(grantEmail.PIName.Displayed);
Assert.IsTrue(grantEmail.Institution.Displayed);
Assert.IsTrue(grantEmail.Title.Displayed);
Assert.IsTrue(grantEmail.PIReqAmt.Displayed);
Assert.IsTrue(grantEmail.DIVRecAmount.Displayed);
Assert.IsTrue(grantEmail.GMSRecAmount.Displayed);
Assert.IsTrue(grantEmail.GMORecAmount.Displayed);
Assert.IsTrue(grantEmail.DIVRank.Displayed);
Assert.IsTrue(grantEmail.RFAPA.Displayed);
Assert.IsTrue(grantEmail.PCC.Displayed);
Assert.IsTrue(grantEmail.PercentileScore.Displayed);
Assert.IsTrue(grantEmail.CouncilNPARS.Displayed);
Assert.IsTrue(grantEmail.NPARSProgramReqNumberofYears.Displayed);
Assert.IsTrue(grantEmail.CANPoolcode.Displayed);
Assert.IsTrue(grantEmail.BatchNumber.Displayed);
}
You can pass a IWebElement object as parameter to WebDriverWait ExpectedConditions.
Similarly to syntax you presented in the question
WebDriverWait w = new WebDriverWait(Driver, TimeSpan.FromSeconds(20));
w.Until(ExpectedConditions.ElementExists(By.XPath(grantEmail.GMSName));
where you passing a grantEmail.GMSName XPath expression.
You can pass a IWebElement object, as following:
WebDriverWait w = new WebDriverWait(Driver, TimeSpan.FromSeconds(20));
w.Until(ExpectedConditions.ElementToBeClickable(grantEmailElement);
where
IWebElement grantEmailElement = Driver.findElement(By.XPath(grantEmail.GMSName));
Here you can see all the available ExpectedConditions.
As you can see, some of them accepting By as parameter and others IWebElement.

How can I wait for an element from another element in C# Selenium

Is there a way to perform a wait.Until by somehow searching the element from another element, rather than from the whole driver?
example:
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSec));
IWebElement element = wait.Until(ExpectedConditions.ElementExists(by));
I cannot modify the 'by' to be too specific and when it is searched under the driver and gets the wrong element.
IWebElement element = wait.Until(drv => drv.FindElement(by));
this option also searches under the driver.
I want something like this:
public static IWebElement WaitElement(this IWebElement webElement, IWebDriver driver, By by, int timeoutInSec = 5)
{
try
{
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSec));
IWebElement element = wait.Until(webElement.FindElement(by));
}
When I try to write this code I get this error:
enter image description here
It may be late, but hopefully will help someone else. Just change the syntax of your last line in the 3rd option to the following:
IWebElement element = wait.Until(d => webElement.FindElement(by));

selenium returning empty text

Following a tutorial to test search functionality on wikipedia using c#. My test keeps failing because the the text from the h1 element im trying to return keeps returning empty. There is definitely text inside the h1 header. Any idea why This element is returning empty when it has text?
IWebDriver driver = new FirefoxDriver();
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(5));
driver.Navigate().GoToUrl("https://en.wikipedia.org/wiki/Main_Page");
IWebElement searchInput = driver.FindElement(By.Id("searchInput"));
searchInput.SendKeys("Christiaan Barnard");
searchInput.SendKeys(Keys.Enter);
IWebElement firstHeading = driver.FindElement(By.Id("firstHeading"));
Assert.AreEqual("Christiaan Barnard", firstHeading.Text);
driver.Quit();
It may be because the element is found, but does not yet have the expected value. The best approach is to wait until the text has the expected value, using WebDriverWait:
var wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(5));
var result = wait.Until(ExpectedConditions.TextToBePresentInElementLocated(By.Id("firstHeading"), "Christiaan Barnard"));
Assert.IsTrue(result);

c# with Selenium: element not visible

I'm trying to create an automated ui test with selenium in c#. Here is my code:
driver = new ChromeDriver();
driver.Manage().Window.Maximize();
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(30));
driver.Navigate().GoToUrl("my_url");
driver.FindElementById("textBox").Clear();
driver.FindElementById("textBox").SendKeys("tire");
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(30));
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.Until((ExpectedConditions.ElementIsVisible(By.Id("Moto"))));
driver.FindElementById("Moto").Click();
Before using a wait.until, I was getting the exception ElementNotVisibleException, but now I'm getting the exception WebDriverTimeoutException because the element with the id "Moto" is not visible.
Here is a screenshot of a part of the DOM:
So why the moto checkbox is not found or is not visible?
Try the below code (in Java) as it is working at my end for the same structure -
driver.findElement(By.xpath("//label[#for='Moto']")).click();
I don't know why it is causing problem to find <input> tag by id
You might need to scroll to the element to make it visible
IWebElement moto = driver.FindElement(By.Id("Moto"));
Actions actions = new Actions(driver);
actions.MoveToElement(moto).Perform();
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.Until(ExpectedConditions.ElementIsVisible(By.Id("Moto"))).Click();

In Selenium IDE, how to make a wait command in selenium test until a browser reloads?

I have used the Selenium IDE to generate some code and I am now i want to put a wait command until the browser reloads after a button click. For example:
public void TheGetTest()
{
driver.Navigate().GoToUrl(baseURL + "/");
driver.FindElement(By.XPath("(//a[contains(text(),'Get Quotes')])[2]")).Click();
}
After the Click command, I want to see what URL is loaded. Is this possible or do I have to have to use some element on the page to look for?
WebDriverWait wait5 = new WebDriverWait(driver, 100);
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement myDynamicElement = wait.Until<IWebElement>(d => d.FindElement(By.Id("someDynamicElement")));
How would this code be used if the dynamic element is the page itself?
Its been some time since i used selenium.
But maybe you can use a javascript function to determine if the document is in ready state again.
wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));

Categories

Resources