-
Notifications
You must be signed in to change notification settings - Fork 29
DatePicker automation sample
Nick Abalov edited this page Oct 8, 2016
·
5 revisions
Here is an example code on how to automate a datepicker by using the rollers.
Having a XAML something like:
<DatePicker Date="{Binding SelectedDate, Mode=TwoWay}" AutomationProperties.AutomationId="MyDateControl" />
We can write a generic method to input a desired date in the DatePicker:
public void InputDate(DateTime date)
{
var datepicker = driver.FindElementById("MyDateControl");
// Find the inner Button in the datePicker
var input = datepicker.FindElement(By.ClassName("Windows.UI.Xaml.Controls.Button"));
input.Click(); // Opens the date picker
Thread.Sleep(1000); // Await animation
// Parse the current datepicker date (this is for spanish format)
string[] values = input.Text.Replace("\u200E", "").Split('/');
var touches = new Actions(this.driver);
var current = new DateTime(Int32.Parse(values[2]), Int32.Parse(values[1]), Int32.Parse(values[0]));
// Year picker
if (current.Year > value.Year)
{
DateTap(400, 450, touches); // Activate Roller
for (int i = current.Year - value.Year; i > 0; i--) DateTap(400, 300, touches);
DateTap(400, 450, touches); // De-activate Roller
}
else if (current.Year < value.Year)
{
DateTap(400, 450, touches); // Activate Roller
for (int i = value.Year - current.Year; i > 0; i--) DateTap(400, 600, touches);
DateTap(400, 450, touches); // De-activate Roller
}
TapAppBar(driver.FindByXName("AcceptBtn"));
input = datepicker.FindElement(By.ClassName("Windows.UI.Xaml.Controls.Button"));
input.Click(); // Opens the date picker
Thread.Sleep(1000);
// Month pick
if (current.Month > value.Month)
{
DateTap(240, 450, touches); // Activate Roller
for (int i = current.Month - value.Month; i>0; i--) DateTap(240, 300, touches);
DateTap(240, 450, touches); // De-activate Roller
}
else if (current.Month < value.Month)
{
DateTap(240, 450, touches); // Activate Roller
for (int i = value.Month - current.Month; i > 0; i--) DateTap(240, 600, touches);
DateTap(240, 450, touches); // De-activate Roller
}
TapAppBar(driver.FindByXName("AcceptBtn"));
input = datepicker.FindElement(By.ClassName("Windows.UI.Xaml.Controls.Button"));
input.Click(); // Opens the date picker
Thread.Sleep(1000);
// Day pick
if (current.Day > value.Day)
{
DateTap(80, 450, touches); // Activate Roller
for (int i = current.Day - value.Day; i > 0; i--) DateTap(80, 300, touches);
DateTap(80, 450, touches); // De-activate Roller
}
else if (current.Day < value.Day)
{
DateTap(80, 450, touches); // Activate Roller
for (int i = value.Day - current.Day; i > 0; i--) DateTap(80, 600, touches);
DateTap(80, 450, touches); // De-activate Roller
}
TapAppBar(driver.FindByXName("AcceptBtn"));
}
private void TapAppBar(IWebElement appBarButton)
{
IJavaScriptExecutor js = driver as IJavaScriptExecutor;
js.ExecuteScript("automation: InvokePattern.Invoke", appBarButton);
}
private void DateTap(int x, int y, Actions touches)
{
touches.MoveByOffset(x, y).Click().Perform();
Thread.Sleep(300);
}