How to drag & drop the element from one window to another window? - java

We have a scenario to automate where we have to drag an element from one window & drop it into another window.
We have tried a few options using Actions class but that didnt work out because after we click & hold the item, we need to switch to another window before dropping it. So once we switch, it loses the item. We are using Selenium with Java. Does anyone know any possible solution for it?

Related

Find and click on all "follow" buttons in instagram using Selenium WebDriver

Hello Fellow Stack Overflow members and coders,
I am trying to make an automation script using Selenium WebDriver on Instagram where I want to follow every member a particular account is following.
I am stuck at a point where after navigating to user's profile (who's follower I want to follow) when I click on "following" link a new window opens and it contains all the members this user follows (as shown in following screenshot):
Window opened after clicking "following" link
Now as you can see in above window only first few followers are initially loaded and then as you keep on scrolling down the users keeps on getting loaded.
I am completely lost here on how can I move the focus to this new jquery kind of window and keep on scrolling down until the full list is loaded and then find once full list is loaded, click on follow button for each user.
Your help would be really appreciated in this regard.
I have tried various options like moving the mouse over to the window and clicking at blank location and then using Keys.Arrow_Down multiple times, finding first Follow button and then keep on pressing down button etc but it doesn't seem to be right approach and it doesn't work. Kindly help me solve this issue.
what if you...
Using a while, get all the visible elements in a list, move using JavascriptExecutor to the last of the element in the list, and keep getting the elements(doing the same, moving to the last pos in the list) until you reach the number(this is the while condition) of following(or following-1 if he/she follows you)
(JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", webElementInList);

Difference between clicking with Selenium and clicking with Robot

Is there a difference between testing perspective and not usability, on clicking elements with selenium like this:driver.findElement(By.id("foobar")).click();
instead of using coordinates and the robot class.
Example: If an element is not clickable because of a bug, robot will not be able to click it. Will selenium be able to click it ?
Selenium tries as much as possible to emulate what a regular user can and cannot do. When you use findElement(...).click() Selenium will raise an exception if operation cannot be performed. For instance, if an element exists in the DOM but is not displayed, an exception will be raised. And note that Selenium's .click() will try to scroll elements. If you ask it to click an element that is not visible but could be visible by scroll it, Selenium will scroll to bring it into view.
Also note that Selenium will usually take the element's coordinates and perform a click at those coordinates. So the idea that a moving element will always be hit by findElement(...).click() (expressed in this answer) is incorrect. Using findElement minimizes the window between which the coordinates are acquired and the click event is sent, but it does not completely eliminate it. The reason that Selenium works with coordinates is, again, to reproduce what a user would do. The user would see the element, move the mouse to the coordinates of the element, and click on it. If the element has an transparent overlay over it, then the overlay will get the click, rather than the element. This works because Selenium clicks at the coordinates rather than send a click directly to the element that you selected with findElement.
If you are using Robot to perform the click, the stakes are roughly the same as above, with a few caveats:
Trying to click moving elements is more of an issue because the window of time between acquiring the coordinates and performing the click is greater.
Robot does not know how the DOM is structured so won't scroll elements for you.
Rogério Peixoto pointed out that you can use JavaScript to perform the click. This will cause the event handler for click to be called for the element, irrespective of whether a user would be in fact able to access the element. This can allow clicking on elements that are not otherwise clickable but I would not do this unless there are overriding reasons to do so. I've gone over the difference between Selenium's click and the JavaScript click in this answer.
If an element is not clickable because of a bug, robot will not be able to click it. Will selenium be able to click it?
It depends on what the bug is that is preventing the click. I would suggest that you use element.click() in almost all cases because it's more maintainable. For coordinate clicks, what if the element moves? Then you have to update your script with the new position where element.click() will just work. Another issue with coordinate clicking, what if your element moves and another one is in its place? That will likely cause your script to fail but will be very hard to track down. An example might be an unexpected popup that covers the element to be clicked. Now your coordinate click will hit the popup and eventually cause an error/failure. If you do element.click() you will at least get an error that another element would receive the click. You can then track down what is getting in the way from debugging.
Selenium clicks in my experience click an element within a browser window, where as Robot click seem to click whatever is on the desktop at the time. Personally I would recommend you try to use Selenium clicks where possible as you can specify the window in which you are clicking.
Using this:
driver.findElement(By.id("foobar")).click();
Means that you will click the element with the foobar id regardless where it is.
If you use coordinates, you won't be able to click the element if they change their position.
Updating answer due to your updated question:
I'm not quite sure where you're trying to get with this.
In Selenium, if the element is visible it will receive the click event, if not you'll have an exception.
You could force click it with javascript:
WebElement element = driver.findElement(By.id("foobar"));
((JavascriptExecutor)driver).executeScript("arguments[0].click();", element);
But it won't trigger the an eventual javascript event registered to that button, you would have to fire it manually.

How to handle a window which automatically closes and says window not found

I have this situation.
Currently on window handling.
I have parent window, child, child1 total 3 windows.
when im selecting some drop down values in parent. It will switch to child (2nd window), in child I have to do basic operation and searching which will take me to child1 (3rd window). After I click submit/double click on data in 3rd window (child1) it will automatically close and come to child (2nd window). After coming to child within 2-3 secs popup/window will open.
This is where i have to close the popup/window and switch to child (2nd window).
I'm facing issue here, window not found because it is automatically getting closed.
Please help me out. Below is my complete code.
You could store all the windows in a Set and switch to child window after child1 closes.
The question is little bit confusing.. the main thing here is getting windowHandles into Set.
when you do any actions may be click or select which triggers new windows, then go for collecting window handles..
Set windows=driver.getWindowHandles();
from collected windows you can switch to required window
If window is displayed or closed due to any actions, known webdriver does not switch focus automatically.. you need to switch. So due to any action window is closed, switch window which is available as per your requirement.
Please provide clear question, if possible logic developed to help on this
Thanks

Unable to select mouse over elements in Selenium Webdriver Java

I am automating a web application using selenium webdriver and java. It has few mouse over elements which I am not able to automate. Mouse over works well and newly visible elements locate properly when I record and play in Selenium IDE but same is not working when I run in eclipse. I have automated similar mouse over elements earlier but facing difficulty in automating this. I have attached screenshot of a web application and the code for mouse over elements and here I am not able to mouse over on "Configuration" menu and select "Configure Hierarchy Metadata". It would be really great if anybody could help me out in this!! Let me know if any more details needed.
Thanks in advance.
This is a very common issue. You need to make sure you are interacting with the element that has the hover listener..
In this case, it looks like it is the <a> that is receiving the hover. Try moving to element (hovering over):
By.cssSelector("ul.topmenu li:nth-child(2) > a[title='Configurations']");
In order to achieve this, you will first have to hover on element(say - element1) which makes element to be clicked(say - element2) on visible and then click on the option from list -
Actions actions = new Actions(driver);
actions.moveToElement(element1).moveToElement(element2).click(element2).build().perform();

Swap mouse buttons in java application

I'm using a dynamic graphic library to display data. By clicking with the left button on a node, a window pops out displaying info about it. I would like to use the right button instead, which by now is used to move the node around (without the window popping out). The problem is: the graph listeners I'm using only respond to the left button. So the only solution I can think of is to swap the mouse buttons mapping on the java application. Is there a way to achieve this?
I might be wrong, but can you use MouseListeners for right click, and than use java.awt.Robot to left click that? just a thought. good luck.
Whoops, sorry. I already solved this a long time ago and I forgot to post the answer: The library I'm using is graphstream, and I just needed to set the graph DefaultMouseManagerm (with overriden functions) which takes care of mouse clicks on the graph.

Categories