Appium in .net drag and drop releases slow - c#

I want to drag and drop an element with selenium. But I noticed that it takes a little bit before he releases after the moveto. Is there a way to speed this up so it will release immediately when the moveto is done?
my current code is:
new TouchAction(_driver)
.LongPress(200, 200).MoveTo(200, 600).Release().Perform();
my driver I setup as following:
var appiumOptions = new AppiumOptions();
_driver = new AndroidDriver<AppiumWebElement>(new Uri("http://127.0.0.1:4723/wd/hub"), appiumOptions);

Related

Appium detects the WindowElements only 30% of the times

I currently work with C# with AppWinDriver and Appium for automated tests for WPF, but in the project app that i work, it is detected correctly sometimes, others times work good and some times open the page but doesn't detect the WindowsElements of the app.
Any idea on the root cause of the issue or a solution or workaround?
Code:
AppiumOptions desiredCapabilities = new AppiumOptions();
desiredCapabilities.AddAdditionalCapability("app",app);
desiredCapabilities.AddAdditionalCapability("createSessionTimeout", "60000");
desiredCapabilities.AddAdditionalCapability("newCommandTimeout", "60000");
desiredCapabilities.AddAdditionalCapability("platformName", "Windows");
desiredCapabilities.AddAdditionalCapability("deviceName", "WindowsPC");
driver = new WindowsDriver<WindowsElement>(new Uri("http://127.0.0.1:4723"), desiredCapabilities, TimeSpan.FromMinutes(5));
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(120);

C# selenium chromedriver click on Allow store files on this device

Hi.
How can I click on 'Allow' button? I really can't find any solution in the internet. I don't want to use c++ hooks or simulate mouse clicks by coordinates. Is there any good way to allow this notification?
new ChromeOptions.AddUserProfilePreference("profile.default_content_setting_values.automatic_downloads", 2);
doesn't help
Found two solutions:
1) Thanks for #Floren 's answer: C# selenium chromedriver click on Allow store files on this device
There is an argument for Chromium --unlimited-storage
Chromium source code reference:
// Overrides per-origin quota settings to unlimited storage for any
// apps/origins. This should be used only for testing purpose.
const char kUnlimitedStorage[] = "unlimited-storage";
# Prevent the infobar that shows up when requesting filesystem quota.
'--unlimited-storage',
C# usage:
var chromeOptions = new ChromeOptions();
chromeOptions.AddArgument("--unlimited-storage");
var driver = new ChromeDriver(chromeOptions);
2) #Simon Mourier's answer C# selenium chromedriver click on Allow store files on this device
Click on Allow button using .NET UIAutomation
var andCondition = new AndCondition(new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Button), new PropertyCondition(AutomationElement.NameProperty, "Allow"));
AutomationElement chromeWindow = AutomationElement.FromHandle(_windowPointer); // IntPtr type
var buttonsFound = chromeWindow.FindAll(TreeScope.Descendants, andCondition);
if (buttonsFound.Count > 0)
{
var button = buttonsFound[0];
var clickPattern = button.GetCurrentPattern(InvokePattern.Pattern) as InvokePattern;
clickPattern.Invoke();
}
You can't, this is an OS level dialogue, not something inside the DOM.
The way to get around it is by using desired capabilities to configure chrome to not show this dialogue.
I'm going to suggest
ChromeOptions options = new ChromeOptions();
options.AddUserProfilePreference("download.prompt_for_download", 0);
options.AddUserProfilePreference("settings.labs.advanced_filesystem", 1);
Other potential commands to add the options if AddUserProfilePreference doesn't work would be:
AddLocalStatePreference
AddAdditionalChromeOption
AddAdditionalCapability
For more details about desired capabilities and chrome have a look at:
The ChromeOptions documentation
This list of command line switches, or the command line switched defined directly in code.
The preferences defined directly in code
The ChromeOptions class in the Selenium codebase
var chromeOptions = new ChromeOptions();
var downloadDirectory = #"C:\Users\";
chromeOptions.AddUserProfilePreference("download.default_directory", downloadDirectory);
chromeOptions.AddUserProfilePreference("download.prompt_for_download", false);
chromeOptions.AddUserProfilePreference("disable-popup-blocking", "true");
chromeOptions.AddUserProfilePreference("profile.default_content_setting_values.automatic_downloads", 1);
IWebDriver _driver = new ChromeDriver(chromeOptions);
Can you try with this one ?

How to get Selenium to operate two browser windows using only one driver selenium (using c# and chromedriver)?

I am attempting to control two browser windows via selenium using c# and a single chromedriver. The reason being that I need to share session details accross browser windows.
The code that I have tried and failed with is below;
var options = new ChromeOptions();
options.AddArguments("chrome.switches", "--disable-extensions --disable-extensions-file-access-check --disable-extensions-http-throttling --disable-infobars --enable-automation ");
options.AddUserProfilePreference("credentials_enable_service", false);
options.AddUserProfilePreference("profile.password_manager_enabled", false);
options.PageLoadStrategy = PageLoadStrategy.Default;
ChromeDriverService service = ChromeDriverService.CreateDefaultService();
service.HideCommandPromptWindow = true;
var Driver = new ChromeDriver(service, options);
//THIS WILL OPEN A NEW WINDOW. BUT BECAUSE IT IS A NEW DRIVER DOES NOT WORK FOR SHARING SESSION DETAILS.
//var TestDriver = new ChromeDriver(service, options);
//TestDriver.Manage().Window.Maximize();
//THIS JUST OPENS UP A NEW TAB. NOT A NEW WINDOW (IT WOULD SEEM MOST DOCUMENTATION SUGGESTS THAT IT SHOULD)
IJavaScriptExecutor jscript = Driver as IJavaScriptExecutor;
jscript.ExecuteScript("window.open();", "google.com.au");
//TRY USING THE SEND KEYS TECHNIQUE. NOTHING HAPPENS
var test = Driver.FindElement(By.TagName("html"));
test.SendKeys(Keys.Control + "n");
test.SendKeys(Keys.Control + "t");
//TRY AGAIN USING THE SEND KEYS TECHNIQUE USING A DIFFERENT TAG. NOTHING HAPPENS
var blah = Driver.FindElements(By.TagName("body"));
blah[0].SendKeys(Keys.Control + "t");
//TRY USING ACTIONS. NOTHING HAPPENS
Actions action = new Actions(Driver);
action.SendKeys(OpenQA.Selenium.Keys.Control + "n");
action.Build().Perform();
I may resort to AutoIt to open a browser if I have to, but one more dependency is not what I need. Documentation everywhere around the web seems to suggest than all the options I tried above should work...I suspect it may be a chromedriver issue of some kind.
Any ideas on how to achieve my goal would be greatly appreciated
UPDATE.
Arnons answer below lead me to the solution. If you are in a similar situation the best thing to do is just open up the browser console (from developers tools) and experiment with javascript until you get what you want. Then just execute that. In the end executing the following code has worked for me.
IJavaScriptExecutor jscript = Driver as IJavaScriptExecutor;
jscript.ExecuteScript("window.open('https://www.bing.com.au','_blank','toolbar = 0, location = 0, menubar = 0')");
The other alternative was to use Autoit, which I also got working, much easier than I did figuring out the javascript. But one less dependency is best :)
UPDATE2.
Further complications arise with trying to control the window as an independent browser window. I believe any new window created from a parent window, has the same process id (at least my testing has indicated so), and for all intense and purpose is treated as a tab in the selinium driver. I therefore conclude that certain things are just not possible (for example relocating the child browser window on the screen).
Your first attempt using ExecuteJavaScript was very close, but In order for it to open a new window instead of new tab, you should add the following arguments: `"_blank", "toolbar=0,location=0,menubar=0" to it.
See this question for more details.
I should have read the question better, here is my solution. Ended up using this for selecting windows that popped up after clicking a button but should work with swapping between windows.
//---- Setup Handles ----
//Create a Handle to come back to window 1
string currentHandle = driver.CurrentWindowHandle;
//Creates a target handle for window 2
string popupWindowHandle = wait.Until<string>((d) =>
{
string foundHandle = null;
// Subtract out the list of known handles. In the case of a single
// popup, the newHandles list will only have one value.
List<string> newHandles = driver.WindowHandles.Except(originalHandles).ToList();
if (newHandles.Count > 0)
{
foundHandle = newHandles[0];
}
return foundHandle;
});
//Now you can use these next 2 lines to continuously swap
//Swaps to window 2
driver.SwitchTo().Window(popupWindowHandle);
// Do stuff here in second window
//Swap back to window 1
driver.SwitchTo().Window(currentHandle);
// Do stuff here in first window
You need to explicitly tell Selenium which tab you wish to interact with, which in this case would be;
driver.SwitchTo().Window(driver.WindowHandles.Last());

Nested Hover in Selenium C#

I am creating the test cases for my learning using Selenium C# in Orange Hrm application.
https://enterprise-demo.orangehrmlive.com/auth/login
Username and password: admin.
Once I login, there are differen menu, I am traversing through Admin>User Management>users and click on Users.
However, I am not getting way to how to use the MouseOver in Selenium C#.
Attached is the screenshot for your reference.enter image description here
From my limited knowledge you'll have to do it in a few steps.
Below is an example using NgWebDriver (angularJS app)
Actions builder = new Actions(ngDriver);
var elementToHover= ngDriver.FindElement(By.ClassName("dpcontract"));
builder.MoveToElement(elementToHover, 10 , 0)
builder.Build().Perform();
This builds a new action by finding the target element, moving the mouse to its position (x/y) with a 10 offset on the x (in my case).
You can add more events to that action trigger. The original (working) code for a drag and drop type-action i have is this
Actions builder = new Actions(ngDriver);
var elementToClick = ngDriver.FindElement(By.ClassName("dpcontract"));
builder.MoveToElement(elementToClick, elementToClick.Size.Width - 1, 0)
.ClickAndHold()
.MoveByOffset(150, 0)
.Release();
builder.Build().Perform();
Thank you Jens Stragier for your suggestion. Based on your suggestion, I wrote as follows and it worked for me.
Actions action = new Actions(Driver);
action.MoveToElement(elemWomen);
Thread.Sleep(500);
action.ClickAndHold(elemWomen);
action.Release(TShirt);
action.Click(TShirt);
action.Perform();

How to clear IE cache webdriver Selenium Grid DesiredCapabilities and InternetExplorerOptions

My original question was unclear I was really looking for a way to start IE with a clean session running on the Grid. I thought the Selenium solution to this was broken, turns out it was how I was using it :facepalm: So I have updated my question to reflect that part.
So my issue is that I cannot get IE to start in a clean session when I run it on Selenium Grid. I have done a fair share of research and implemented the DesiredCapabilities that is supposed to handle this for IE.
internetExplorerCapabilities.SetCapability(ieOptions.EnsureCleanSession.ToString(), true);
But sadly this is not working and I have opened a ticket with the selenium developers if you are interested in tracking it.
Your code ieOptions.EnsureCleanSession.ToString() will return true or false and not ensureCleanSession. To set the capability:
var options = new InternetExplorerOptions();
options.EnsureCleanSession = true;
options.RequireWindowFocus = true;
var capabilities = (DesiredCapabilities)options.ToCapabilities();
capabilities.SetCapability(CapabilityType.Version, "11");
var driver = new RemoteWebDriver(new Uri("http://10.34.161.112:5555/wd/hub"), capabilities);

Categories

Resources