Может ли кто-нибудь помочь мне автоматизировать DatePicker в Android 6.0 с помощью Appium и Java? Мне удалось автоматизировать это только для дат текущего месяца. Но мне нужно установить дату для любой даты, которую я передаю методу.




Я наконец решил это. То, что я сделал, было из средства выбора даты, которое я взял текущий год и месяц. Исходя из этого, я вычислил количество нажатий для перехода вперед или количество нажатий для возврата к заданной дате. Вот фрагмент кода для этого.
public class Base {
// Pass monthName param as "August"
public int getMonthNumber(String monthName) throws ParseException {
Date date = new SimpleDateFormat("MMMM").parse(monthName);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
System.out.println(calendar.get(Calendar.MONTH) + 1);
return calendar.get(Calendar.MONTH) + 1;
}
// Pass date param as "Sun, Jul 1"
public String getMonthNameInThreeChars(String date) {
return date.substring(5, 8);
}
}
public class CommonLocators extends Base {
public void setAndroidDatePicker(String date) throws IOException, ParseException {
int thisYear = Integer.valueOf(androidDriver.findElement(By.id("android:id/date_picker_header_year")).getAttribute("name"));
String today = androidDriver.findElement(By.id("android:id/date_picker_header_date")).getAttribute("name");
int thisMonth = getMonthNumber(getMonthNameInThreeChars(today));
// Split the given date into date, month and year
String[] splitdate = date.split("\\s+");
int givenDay = Integer.valueOf(splitdate[0]);
int givenMonth = getMonthNumber(splitdate[1]);
int givenYear = Integer.valueOf(splitdate[2]);
int forwardTaps = 0;
int backwardTaps = 0;
int yearFactor = 0;
if (givenYear == thisYear)
{
if (givenMonth >= thisMonth)
{
forwardTaps = givenMonth - thisMonth;
} else {
backwardTaps = thisMonth - givenMonth;
}
}
else if (givenYear > thisYear)
{
yearFactor = (givenYear - thisYear) * 12;
if (givenMonth >= thisMonth)
{
forwardTaps = yearFactor + (givenMonth - thisMonth);
} else {
forwardTaps = yearFactor - (thisMonth - givenMonth);
}
}
else {
yearFactor = (thisYear - givenYear) * 12;
if (givenMonth >= thisMonth)
{
backwardTaps = yearFactor - (givenMonth - thisMonth);
} else {
backwardTaps = yearFactor + (thisMonth - givenMonth);
}
}
for (int i=1; i<=forwardTaps; i++) {
androidDriver.findElement(By.id("android:id/next")).click();
}
for (int i=1; i<=backwardTaps; i++) {
androidDriver.findElement(By.id("android:id/prev")).click();
}
String xpath = "//android.view.View[@text='day']";
androidDriver.findElement(By.xpath(xpath.replace("day", String.valueOf(givenDay)))).click();
//Tap on OK button of the date picker
androidDriver.findElement(By.id("android:id/button1")).click();
}
}
public class CommonStepDefinitions {
@Test
public void setDate(String date) throws IOException, ParseException {
commonLocators.setAndroidDatePicker(date);
}
}
@sandeepmaaram Спасибо за отзыв. Да, мы можем это оптимизировать. Можете ли вы объяснить самый простой способ выбрать этот день из этого средства выбора даты? Я имею в виду последовательность действий. Тогда мы сможем оптимизировать код. Кстати, можете ли вы проголосовать за это, так как это будет полезно для других?
Процесс похож на: нажмите любую кнопку, появится средство выбора> щелкните год> появится список лет, прокрутите и выберите нужный год> затем выберите предыдущий / следующий месяц> выберите дату.
@sandeepmaaram Да, вы правы. Мы можем сделать это таким образом.
не могли бы вы поделиться информацией об androidDriver, который вы используете в своем коде? Это Аппиум?
@RameshNatesan да, согласно вопросу, этот драйвер является драйвером appium
Используйте Android (Espresso only)
$driver.execute_script('mobile:setDate', { year: 2020, monthOfYear: 1, dayOfMonth: 25, element: $driver.find_element(:id, 'android:id/datePicker') })
Эй, это решение работает. Но если я хочу выбрать дату 5 лет назад, тогда 5 * 12 = 60 раз выполнение действия click () на android: id / prev. Можем ли мы это оптимизировать? заранее спасибо