Hello I'm a little new to selenium I'm trying to automate a page for work. The issue I'm having is that webdriver waits are not finding my elements, but I can use those elements if I comment out the wait portion. The issue seems to start after I switch the frame. Is there any additional steps I need to do after that?
Update: When I am debugging and stepping through it works fine. But never works in test run
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(120));
wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.FrameToBeAvailableAndSwitchToIt(By.CssSelector("iframe[src='/CreditAdmin/']")));
wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementExists(By.CssSelector("input[aria-label='Filter for column']"))); //This never finds the Element
IWebElement companySearch = driver.FindElement(By.CssSelector("input[aria-label='Filter for column']")); //This works fine if I comment out previous
companySearch.SendKeys(fieldValue);
Try to change
wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementExists(By.CssSelector("input[aria-label='Filter for column']")));
to:
wait.Until(c => c.FindElement(By.CssSelector("input[aria-label='Filter for column']")));
Related
Sometimes, Selenium C# launches chrome as well as the website, but is unable to interact with it.
On close inspection, I noticed that it was because chrome was not in focus and was not loading the UI.
As soon as I focused the chrome, I would see a white screen for half a second, and then UI appeared. And as soon as UI appeared, the test started running well.
I feel like chrome can not get enough system resources without the background. Any help would be appreciated. I never faced the issue in selenium-python.
Website is - web.whatsapp.com
It look like you are not giving enough time for page to load. You can use any of the below wait technique.
Explicit Wait in Selenium C#
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
String ele_xpath = "<xpath of element>"
WebDriverWait wait = new WebDriverWait(driver,30);
IWebElement welcomeMessage =
wait.until(ExpectedConditions.visibilityOfElementLocated(By.XPath(ele_xpath)));
// Here I have assumed first page is having a welcome message, you can use any element present on your page. Your script will wait up to 30 sec for element to appear before it will throw timeoutexception
implicit wait in Selenium C#
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
//Above will make script to wait for each element up to 30 sec
waiting in C#:
You can ask your script to wait for a defined millisecond before executing next line of code:
Thread.Sleep(6000);
# It will for 6 sec
Fluent Wait in Selenium C#
Wait<WebDriver> fluentWait = new FluentWait<WebDriver>(driver)
.withTimeout(30, SECONDS) // this defines the total amount of time to wait for
.pollingEvery(2, SECONDS) // this defines the polling frequency
.ignoring(NoSuchElementException.class); // this defines the exception to ignore
WebElement welcomeMessage= fluentWait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) //in this method defined your own subjected conditions for which we need to wait for
{ return driver.findElement(By.xpath("//*[contains(text(),'Welcome')]"));
}});
Note : You can use any of the above wait method. However each of them have their own advantage/ disadvantage. Please read more about them and difference at below link:
https://www.lambdatest.com/blog/selenium-waits-implicit-explicit-fluent-and-sleep/
Please try the following - it will force focus on Chrome (from the information provided I can assume there a JS event which blocks the page loading or trigger onfocus event).
var driver = new ChromeDriver();
driver.Manage().Window.Maximize(); // will focus or at least bring to front
// other things to try - switch
driver.SwitchTo().DefaultContent();
driver.SwitchTo().ActiveElement();
// other things to try - JavaScript
((IJavaScriptExecutor)driver).ExecuteScript("document.querySelector('body').focus();")
Guys, I have started to work on selenium web driver. You can assume I am a beginner. At the moment I am having difficulties in implementing the implicit wait command in my code (C#). it is not working as it should and result in an exception due to Element not found, however when I add the "Thread.Sleep(3000) the code get executed flawlessly. I have been looking for the solution all over the internet but not able to resolve the problem. Below I have mentioned sample code.
class Entrypoint
{
static void Main()
{
IWebDriver driver = new ChromeDriver();
**driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(20);**
driver.Navigate().GoToUrl("https://r1.netrevelation.com:8443/mcba-cms/pages/flight-transfer.cab");
driver.Manage().Window.Maximize();
driver.FindElement(By.Id("loginlink")).Click();
driver.FindElement(By.Id("headerSubView:inputUserName:input")).SendKeys("st001");
driver.FindElement(By.Id("headerSubView:inputPassword:input")).SendKeys("hello321" + Keys.Enter);
driver.FindElement(By.Id("dateOfFlight:input")).Click();**//This Step does not get Executed , it throws exception element not found.**
driver.FindElement(By.Id("ui-datepicker-div")).Click();
driver.FindElement(By.XPath(".//*[#id='ui-datepicker-div']/div/a[2]/span")).Click();
driver.FindElement(By.LinkText("28")).Click();
IWebElement Flightno = driver.FindElement(By.Id("selectedFlight:input"));
Flightno.SendKeys("BA901" + Keys.Enter);
IWebElement Flighttick = driver.FindElement(By.Id("flightTickImg"));
driver.Quit();
Please note that at the moment I don't want to use explicit wait, as implicit will serve my need (if it starts working). The above code Run in supersonic speed for somehow it manages to Login into the system but afterward it Fails every time reason being once Login request is made system pauses for 2-3 seconds. Please provide your comment in this regard.
As per the documentation, an Implicit Wait is to tell the WebDriver to poll the HTML DOM for a certain amount of time when trying to find an element() or find all elements() if they are not immediately available. But availability of an element in the DOM Tree doesn't guarantees that the ElementToBeClickable as you have tried in your code block. Hence you face the exception as Element not found.
Solution:
So the solution to your issue is to induce Explicit Wait i.e. WebDriverWait with ExpectedConditions clause as ElementToBeClickable which will not only confirm the availability of an element in the HTML DOM but also ensure that the Element is Clickable i.e. Element is Displayed and Enabled as follows:
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement element = wait.Until(ExpectedConditions.ElementToBeClickable(By.Id("loginlink")));
I'm getting a StaleElementReferenceException (Element is not attached to the page document) whenever I try to use Actions to move to an element not on the page the driver is first loaded with; however, the element shows up in both the DOM and the page source. I'm using Selenium with ChromeDriver version 2.30. I've tried running Chome in headless mode as well. I've also tried to switch the binary to Chrome beta and Chrome Canary.
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.Until(d =>
{
try
{
IWebElement e = driver.FindElementById(ID);
builder.MoveToElement(e).Build().Perform();
builder.Click().Build().Perform();
return true;
}
catch { }
return false;
});
It tries multiple times to find the element, but never can; it hangs on MoveToElement and returns the exception. As you can see, I've already tried to wrap the whole thing in a try/catch loop; it still never gets the element. Any help would be appreciated!
Create a new Actions object. They're apparently page-specific, so the old one stops working after navigation.
builder = new Actions(driver);
I have encountered an issue with how to wait for drop down element using selenium webdriver. I have a drop down element i wish to wait for before selecting an element from it. I have tried using the following code. can anyone Please help in c# please
{
WebDriverWait wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
var waiting= wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(By.Id("foo")));
//The Dom is refreshed at this stage, and a staleelementReferenceException is thrown.
SelectElement ddl = new SelectElement(waiting[0]);
ddl.SelectByText("itemToBeSelected");
}
in java i used wait.until(ExpectedConditions.visibilityOfElementLocated(By locator) try to use visibilityOfElementLocated in C# maybe that will work
I have the following scenario:
I want to navigate to a page. Then click a button as soon as it appears(not wait for page to load ). I don't want to wait for the initial page to load as it takes a long time. My program currently is stuck until the page loads and then clicks the button.
I basically want to navigate to link and then have no wait for page and continue with my code.
Is there anyway round this?
With the latest version of the .NET bindings, you can set a page load timeout. However, there are some caveats you'll need to be aware of. First, this hasn't been implemented by all browsers. It should work for IE and Firefox, if memory serves. Secondly, you'll need to catch an exception to make that work properly, but it can be done.
// WARNING! Completely untested code written without
// the benefit of an IDE!
IWebDriver driver = new InternetExplorerDriver();
driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(1));
try
{
driver.Url = "http://your.long.loading.page.com";
}
catch (TimeoutException)
{
// NOTE: In 2.26 or later, this will be WebDriverTimeoutException
}
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement element = wait.Until<IWebElement>((d) =>
{
return d.FindElement(By.Id("yourId"));
}
IWebDriver driver = new FirefoxDriver();
driver.Url = "http://somedomain/url_that_delays_loading";
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement myDynamicElement = wait.Until<IWebElement>((d) =>
{
return d.FindElement(By.Id("someDynamicElement"));
});
It does exactly what you want. It queries the page to find the element, catches exceptions if no element found and returns an element when found.
After that, you can manipulate the button ignoring the fact that page can be not loaded
http://seleniumhq.org/docs/04_webdriver_advanced.html
Short answer: No.
Long answer: Selenium is by default trying to simulate the real user - I know that it kinda sucks, especially at a times you need to test a deploy after deploy after deploy...
But: If real user has to wait for button to appear, then the program has to do it also...
BTW: If the button really appears among first on the page, you can try this:
search for the button by ID, xpath ... the way you do it
Catch exception (I am Java guy, so dont ask me how)
If there was error, wait short time (e.g. 200 milliseconds) and then go to 1
If not, click the button
The cycle should end also if certain amount of time passes (10s) and if so, throw exception
As stated above: Language of my choice is Java. There I can do that. But I dont know how to write that in C#