Let me start by saying that this is my first post to stackoverflow, so please tell me when I did something wrong.
I did a project where I open a firefox, create multiple tabs and then go to different websites in each of them, startin from left to right. At the moment, every time the work in one tab is done, it switches to the next one and starts working there. However, what my customer wants the browser to do is that it stays on the first tab opened, so that he can look at the results displayed, while selenium continues to work in the other tabs in the background.
I open the new tabs with
ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(tabs.get((tabPosition)));
To be honest, I don't even know if this is possible at all. Any help is appreciated.
The clear answer is NO
Selenium required focus to correspondent window/tab/frame to work on and interact with the element of that page.
Yours customer's wishes incorrect. Driver work in background.
You have to return to your first tab after Selenium go to enother tab. For this add to your code string:
String firstTab = driver.getWindowHandle();
And after any tabs always switch your driver to the first tab:
for (String tab: driver.getWindowHandles()) {
if (!tab.equals(firstTab)) {
driver.switchTo().window(firstTab);
}
}
Related
I am trying to create a tab system, with similar function to tabs in Chrome, where there is a cross on each tab to close it, like this:
With JavaFX, I can get close, by setting the tabpane closing policy to ALL_TABS. Unfortunately this means my new tab button (also a tab iself) can be closed:
I am aware of the SELECTED_TAB rule, which would fix this problem, but this would defeat the purpose. I am not aware of any other closing policy that would allow exceptions to the ALL_TABS rule.
I tried adding my own cross to each tab individually using the setGraphic method for the Tab class, however I couldn't figure out how to handle that mouse click event such that it closed the correct tab.
I realise I could also make the new tab button something other than a tab, but I wouldn't really know how to integrate that with the tab pane.
So, is there a simpler method that I'm not seeing? If not, then how can I achieve this kind of tabbing system in JavaFX?
plusTab.setClosable(false);
I did a simple skim of the documentation. Will this work?
The case of the disappearing pop-up window!
I click a link and it is supposed to bring up a little dialog pop-up window where I can change the State (like MA, VA, etc). I then would click OK, the pop-up window would disappear and I'd be back on the main window having fun with wild abandon.
That's what happens when I do it manually. When I do it through my nifty Selenium Java project the link gets clicked a pop-up window briefly appears then poof! It's gone and I mean really gone, not just in the background.
Here's a code sniipet:
WebElement foo4 = driver.findElement(By.linkText("State:"));
String myText;
myText = foo4.getText();
System.out.println("I got: " + myText);
foo4.click();
(do stuff in the pop-up window down here)
I threw a println in there to make absolutely sure that foo4 really is the link to be clicked and it is! Sanity checks help sometimes.
When the click event happens, poof! That pop-up window shows kinda like a ghost for a split second totally blank and then it's gone. I have no idea what's happening. It IS intermittent. 10% of the time the pop-up window does appear but most of the time no dice.
I'm open to ideas here. It's not a matter of cycling through the available windows yet, I only have a main window so that's not even in the picture yet.
Any help appreciated!
Instead of clicking the element, scrape the href or similar attribute that holds the URL, then do driver.get(url); or whatever it looks like in Java.
That way you can navigate to the URL in the main browser window and do what you need to do there.
I have searched many, many places for a solution to my problem, but haven't found it. I figured that by now, Selenium would have provided a straight forward and simple solution to handling modal windows/dialogs from Internet Explorer using Java.
The web application that I am testing has the following characteristics:
It is ONLY supported by Internet Explorer (no way around this)
Main page accepts a userid and password, with a "Login" button
Upon login and on page load, there is a pop up "Welcome - What's new" window with a checkbox to "Don't display this again" and an "OK" button to dismiss the window.
I cannot do anything to the parent window until I dismiss the pop up window
Right-click is disabled on the pop-up window (however, I can see the source code by opening the F12 tools before login and window pop-up)
This is what I've tried:
getWindowHandles() always returns 1 for the parent window, so this makes driver.switchTo(handle) not-applicable
It is not an alert, so driver.switchTo().alert() or accept() do not work
findElement(By whatever) will NOT find any elements in the pop up window (like the "OK" button or the checkbox, etc.)
Robot class is the only thing that I have seen work, where I can send keypresses to navigate to the "OK" button and click it to dismiss the window...
Here is my issue:
Since there is a checkbox to "Don't show this again", there are users for which this modal pop up window will display and some for which it won't. I need to account for both cases
I need to find a 100% sure way to know whether the pop up is displayed or not. If I have this information, I can make use of the Robot class (although "dirty") to perform actions on the pop up if needed
I tried finding out if the parent window elements are enabled using isEnabled(), but even though items are not manually "clickable" while the modal pop up window is displayed, isEnabled() always returns TRUE--so this does not work--is there a better way to check for this for the "blocked" elements in the background?
My questions:
How do you check for the existence of a modal pop up that does not display 100% of the time? (on Internet Explorer 10, using Selenium with Java)
Besides using Robot class, how do you interact with the actual Elements in a modal pop-up dialog (for example, dynamic Radio Buttons that don't always display the same options to the user)?
Thank you.
You should use WebDriverWait with some expected condition. For example,
WebDriverWait wait = new WebDriverWait(driver, 5); // sets timeout to 5 seconds
wait.until(...); // Use ExpectedCondition to set the condition you need to check for (i.e. element to be clickable, frame to be visible, etc.)
// Do your thing.
The until method will return an object type relative to the function passed. For example, until(ExpectedConditions.elementToBeClickable(...)); will return a WebElement object you can use to exert an action on (like clicking on it).
Lastly, you should wrap those lines in a try/catch and handle the TimeoutException the wait method will throw if the condition never arises.
To summarize, structurally, your code should look something like this:
// instantiate the WebDriver
...
int timeoutMax = 2; // The maximum number of seconds you wish to wait before timing out (let's assume 2 seconds is reasonable for your case)
try {
By checkboxLocator = By.id("checkboxID"); // Locate element by some criteria (id, css, xpath). Using by ID for illustration purposes only
By buttonLocator = By.id("buttonID"); // same as above
By popupLocator = By.id("frameid"); // same as above
WebDriverWait wait = new WebDriverWait(driver, timeoutMax);
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(popupLocator)); // assuming it is an iframe
// The next lines will not be executed if the "Don't display this again" and clicking "OK" were clicked before (locating the frame will timeout because it not be visible)
WebElement checkbox = wait.until(ExpectedConditions.elementToBeClickable(checkboxLocator));
WebElement okBtn = wait.until(ExpectedConditions.elementToBeClickable(checkboxLocator));
checkbox.click();
okBtn.click();
driver.switchTo().defaultContent(); // Switch back to default window
} catch (TimeoutException exc) {
// Handle exception (i.e. log a warning) - This should be thrown as long as the modal dialog doesn't become visible
// If modal dialog ever becomes visible again, clicking on the checkbox and OK button will be executed again.
}
Something like this should work. Of course, this make some assumptions that might not be true for your case. However, if you use the right locating technique for your modal dialog, you should be able to:
Locate the modal window (use By class to locate it)
Use WebDriverWait to setup your timeout conditions
Tell the driver to switch to it (if this times out, skip steps 3, 4, and 5)
Locate the checkbox and OK buttons
Click the checkbox and the OK button in that order
Tell the driver to switch back to the main window
Continue with your test
Create an If statement in terms of a boolean variable to check for the existence of a modal pop up that does not display 100% of the time.
If the modal is html generated (which it should be, if it holds dynamic content), then try:
driver.switchTo().activeElement();
driver.switchTo().defaultContent();
Also, you may have to insert a wait so that the html has time to generate.
If the modal is a browser alert, then try:
alert.accept();
I have a Menu Element that pops down only when clicked and then fades out on losing focus. My task is to click on a hidden sub menu item.
From previous answers to similar situations I used the following code to click on the Sub menu Items.
Actions builder = new Actions(driver);
WebElement mainMenuElement= driver.findElement(By.id("Mainmenu"));
builder.moveToElement(mainMenuElement).build().perform();
mainMenuElement.click();
Thread.sleep(2000);
WebElement mySubMenu=driver.findElement(By.xpath("//a[text()='Kit Components']"));
mySubMenu.click();
But, when I run the code in chrome v 27, once in three times or so the submenu item never gets clicked. The mainmenu opens up and stays still forever. But the submenu.click() is executed everytime without Exceptions and the submenu is also visible.
Is this because of my code? or
Could this be because the Submenu item has a localized region for Click? i.e Manually when I click on the submenu, the click works only on the text and not on remaining blank regions of the element.
Im using selenium 2.33 Java with chrome v 27.
Any advice would be very helpful, thanks.
First off, please, don't use Thread.sleep in your code. Ever. Instead, use the FluentWait or WebDriverWait commands.
Now, to answer your question, it seems as if you have stumbled upon what some people call a "flapper", or a "flakey test". If your test fails one in three times or so, something is really flakey.
I have noticed every once in a while that the click function doesn't always do the actual click (even though every indication in the code says it did). I wonder if you're happening upon this? Usually I do a check to see if the click seems to happen. If it tried clicking in the code but nothing happens, I will let it retry the click. If the retry doesn't work, then something is really up.
Using JavaFX 2.2 I have a window which consists mainly of a TabPane with 4 Tabs. The user may make changes to data presented in any of the tabs, and if they do, I want to make sure they don't loeave that tab until they've saved/cancelled/updated the data. In particular I want to make sure they don't select a different tab. I can catch if they're trying to quit or execute some menu item, but I can't seem to find a way to interrupt a tab change. I can catch when they've clicked on a new tab (onSelectionChanged), and ask if they really want to discard their edits, but then the tab change happens anyway.
Help greatly appreciated.
You can disable other tabs until user clicks 'Save' or 'Cancel'
Get the selection model of the tab pane, monitor it's selected index property for changes and, when you detect a change ask your tab if it is ok to change now - if not, set the selected index back to the currently selected tab, overriding the selection change to a new tab.