ZennoDroid Enterprise - как сделать swipe

Регистрация
23.12.2014
Сообщения
646
Благодарностей
198
Баллы
43
Ребят помогите "реализовать" нормальный swipe, штатный делает только ровные (точка А - точка Б)
Все таки свайп обычно бывает Косой
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 371
Баллы
113
C#:
var droid = instance.DroidInstance;

// Простой свайп
// (Координаты начальной точки, координаты конечной точки, длительность)
droid.Input.Swipe(200, 200, 1000, 500, 1000);

// Свайп по кривой Безье.
// (Координаты начальной точки, координаты промежуточной точки, координаты конечной точки, длительность)
droid.Input.SwipeCurved(200, 200, 200, 700, 1000, 500, 1000);
 
  • Спасибо
Реакции: seodamage
Регистрация
23.12.2014
Сообщения
646
Благодарностей
198
Баллы
43
C#:
var droid = instance.DroidInstance;

// Простой свайп
// (Координаты начальной точки, координаты конечной точки, длительность)
droid.Input.Swipe(200, 200, 1000, 500, 1000);

// Свайп по кривой Безье.
// (Координаты начальной точки, координаты промежуточной точки, координаты конечной точки, длительность)
droid.Input.SwipeCurved(200, 200, 200, 700, 1000, 500, 1000);
Спасибо!!!
Сам код работает, но при попытке в место чисел подставить переменную ломается сам шаблон.....
пробывал
var droid = instance.DroidInstance;
// Свайп по кривой Безье.
// (Координаты начальной точки, координаты промежуточной точки, координаты конечной точки, длительность)
droid.Input.SwipeCurved(200, project.Variables["swy"].Value, 200, 700, 1000, 500, 1000);
и так
var droid = instance.DroidInstance;
// Свайп по кривой Безье.
// (Координаты начальной точки, координаты промежуточной точки, координаты конечной точки, длительность)
droid.Input.SwipeCurved(200, {-Variable.swy-}, 200, 700, 1000, 500, 1000);
 

Anatoly79

Moderator
Регистрация
17.04.2020
Сообщения
474
Благодарностей
372
Баллы
63
droid.Input.SwipeCurved(200, project.Variables["swy"].Value, 200, 700, 1000, 500, 1000);
project.Variables["swy"].Value - это строка.
Все параметры должны быть числовыми, т.е. нужно преобразовать строку в число.

C#:
var droid = instance.DroidInstance;
int y1 = Convert.ToInt32(project.Variables["swy"].Value);
droid.Input.SwipeCurved(200, y1, 200, 700, 1000, 500, 1000);
 
Регистрация
23.12.2014
Сообщения
646
Благодарностей
198
Баллы
43
project.Variables["swy"].Value - это строка.
Все параметры должны быть числовыми, т.е. нужно преобразовать строку в число.

C#:
var droid = instance.DroidInstance;
int y1 = Convert.ToInt32(project.Variables["swy"].Value);
droid.Input.SwipeCurved(200, y1, 200, 700, 1000, 500, 1000);
Спасибо!!!!
 
Регистрация
23.12.2014
Сообщения
646
Благодарностей
198
Баллы
43
А не подскажете как добиться прокрутки (быстрого свайпа)?
 

Anatoly79

Moderator
Регистрация
17.04.2020
Сообщения
474
Благодарностей
372
Баллы
63
А не подскажете как добиться прокрутки (быстрого свайпа)?
Последний параметр - продолжительность свайпа. Чем меньше значение, тем быстрее выполняется свайп, соответственно будет эффект быстрого движения пальцем по экрану.
Попробуйте снизить значение 500 - 400 - 300... Главное сильно не понижать, иначе UI может не успеть среагировать на движение.
 
Регистрация
23.12.2014
Сообщения
646
Благодарностей
198
Баллы
43
Последний параметр - продолжительность свайпа. Чем меньше значение, тем быстрее выполняется свайп, соответственно будет эффект быстрого движения пальцем по экрану.
Попробуйте снизить значение 500 - 400 - 300... Главное сильно не понижать, иначе UI может не успеть среагировать на движение.
Неа, похоже ниже 1000 бестолку ускорять (UI похоже не переваривает)
 

Anatoly79

Moderator
Регистрация
17.04.2020
Сообщения
474
Благодарностей
372
Баллы
63
Неа, похоже ниже 1000 бестолку ускорять (UI похоже не переваривает)
Очень странно. Я имел в виду значения ниже 100.
Если у Вас экран 720x1440, попробуйте:
C#:
var droid = instance.DroidInstance;
droid.Input.Swipe(360, 1100, 360, 200, duration:500);
//или
droid.Input.Swipe(360, 1100, 360, 200, duration:250);
 
Регистрация
23.12.2014
Сообщения
646
Благодарностей
198
Баллы
43
Очень странно. Я имел в виду значения ниже 100.
Если у Вас экран 720x1440, попробуйте:
C#:
var droid = instance.DroidInstance;
droid.Input.Swipe(360, 1100, 360, 200, duration:500);
//или
droid.Input.Swipe(360, 1100, 360, 200, duration:250);
все равно не то......
 

Anatoly79

Moderator
Регистрация
17.04.2020
Сообщения
474
Благодарностей
372
Баллы
63
все равно не то......
Медленно? Попробуйте снизить значение duration. Тут конечно нужно подбирать все индивидуально. Свайп и при физическом нажатии пальцем в реальной жизни часто ведет себя по разному, то быстрее, то медленнее, то подвиснет что-то на экране.

droid.Input.Swipe - это простая функция, где можно задать только координаты и длительность.
Если не получится, можно использовать более низкоуровневый вариант с использованием функций FingerDown, FingerMove, FingerUp, которые позволяют совершать нажатие и движение произвольным образом:
C#:
var droid = instance.DroidInstance;
int x1 = 360;
int y1 = 1100;
int x2 = 360;
int y2 = 200;
int step = 10;
int delayMs = 5;

droid.Input.FingerDown(x1, y1);
for (int y = y1 + step; y > y2; y-=step)
{   
    droid.Input.FingerMove(x1, y);
    Thread.Sleep(delayMs);
}
droid.Input.FingerUp(x2, y2);
 
Регистрация
23.12.2014
Сообщения
646
Благодарностей
198
Баллы
43
Медленно? Попробуйте снизить значение duration. Тут конечно нужно подбирать все индивидуально. Свайп и при физическом нажатии пальцем в реальной жизни часто ведет себя по разному, то быстрее, то медленнее, то подвиснет что-то на экране.

droid.Input.Swipe - это простая функция, где можно задать только координаты и длительность.
Если не получится, можно использовать более низкоуровневый вариант с использованием функций FingerDown, FingerMove, FingerUp, которые позволяют совершать нажатие и движение произвольным образом:
C#:
var droid = instance.DroidInstance;
int x1 = 360;
int y1 = 1100;
int x2 = 360;
int y2 = 200;
int step = 10;
int delayMs = 5;

droid.Input.FingerDown(x1, y1);
for (int y = y1 + step; y > y2; y-=step)
{  
    droid.Input.FingerMove(x1, y);
    Thread.Sleep(delayMs);
}
droid.Input.FingerUp(x2, y2);
Пошустрее конечно, но не прокручивает по инерции.....
 

Anatoly79

Moderator
Регистрация
17.04.2020
Сообщения
474
Благодарностей
372
Баллы
63
не прокручивает по инерции.....
На моем телефоне, чтобы добиться инерции нужно вести пальцем не равномерно, а с ускорением. Т.е. начинаем медленно и постепенно наращиваем скорость.

Примерно так,
C#:
var droid = instance.DroidInstance;
int x1 = 360;
int y1 = 1100;
int x2 = 360;
int y2 = 300;
int step = 10;
int increaseStep = 10;
int delayMs = 5;

droid.Input.FingerDown(x1, y1);
for (int y = y1 + step; y > y2; y-=step)
{ 
    droid.Input.FingerMove(x1, y);
    Thread.Sleep(delayMs);

// Каждый следующий шаг длиннее предыдущего => скорость выше.
    step+=increaseStep;
}
droid.Input.FingerUp(x2, y2);
У Вас вообще задача свайпнуться "куда-нибудь вниз" ? Для этого можно использовать более интересные методы, например, поиск заведомо несуществующего элемента с пролистыванием экрана ScrollToElementByAccessibilityId:

C#:
var droid = instance.DroidInstance;
//Сколько раз крутануть экран
var count = 3;

try
{
droid.AppiumDriver.ScrollToElementByAccessibilityId("fake-id", count);
}
catch (System.Net.WebException e) when (e.Message.Contains("no such element")){
    // Элемент не существует, но нам это не важно
    return 0;  
}
 
  • Спасибо
Реакции: Kiriller и temavorobey
Регистрация
23.12.2014
Сообщения
646
Благодарностей
198
Баллы
43
На моем телефоне, чтобы добиться инерции нужно вести пальцем не равномерно, а с ускорением. Т.е. начинаем медленно и постепенно наращиваем скорость.

Примерно так,
C#:
var droid = instance.DroidInstance;
int x1 = 360;
int y1 = 1100;
int x2 = 360;
int y2 = 300;
int step = 10;
int increaseStep = 10;
int delayMs = 5;

droid.Input.FingerDown(x1, y1);
for (int y = y1 + step; y > y2; y-=step)
{
    droid.Input.FingerMove(x1, y);
    Thread.Sleep(delayMs);

// Каждый следующий шаг длиннее предыдущего => скорость выше.
    step+=increaseStep;
}
droid.Input.FingerUp(x2, y2);
У Вас вообще задача свайпнуться "куда-нибудь вниз" ? Для этого можно использовать более интересные методы, например, поиск заведомо несуществующего элемента с пролистыванием экрана ScrollToElementByAccessibilityId:

C#:
var droid = instance.DroidInstance;
//Сколько раз крутануть экран
var count = 3;

try
{
droid.AppiumDriver.ScrollToElementByAccessibilityId("fake-id", count);
}
catch (System.Net.WebException e) when (e.Message.Contains("no such element")){
    // Элемент не существует, но нам это не важно
    return 0; 
}
Спасибо! но этот вариант прокручивает сначала на верх 1 раз, а потом 3 раза вниз
 

temavorobey

Client
Регистрация
28.07.2022
Сообщения
17
Благодарностей
1
Баллы
3
На моем телефоне, чтобы добиться инерции нужно вести пальцем не равномерно, а с ускорением. Т.е. начинаем медленно и постепенно наращиваем скорость.

Примерно так,
C#:
var droid = instance.DroidInstance;
int x1 = 360;
int y1 = 1100;
int x2 = 360;
int y2 = 300;
int step = 10;
int increaseStep = 10;
int delayMs = 5;

droid.Input.FingerDown(x1, y1);
for (int y = y1 + step; y > y2; y-=step)
{
    droid.Input.FingerMove(x1, y);
    Thread.Sleep(delayMs);

// Каждый следующий шаг длиннее предыдущего => скорость выше.
    step+=increaseStep;
}
droid.Input.FingerUp(x2, y2);
У Вас вообще задача свайпнуться "куда-нибудь вниз" ? Для этого можно использовать более интересные методы, например, поиск заведомо несуществующего элемента с пролистыванием экрана ScrollToElementByAccessibilityId:

C#:
var droid = instance.DroidInstance;
//Сколько раз крутануть экран
var count = 3;

try
{
droid.AppiumDriver.ScrollToElementByAccessibilityId("fake-id", count);
}
catch (System.Net.WebException e) when (e.Message.Contains("no such element")){
    // Элемент не существует, но нам это не важно
    return 0; 
}
Здравствуйте, а подскажите пожалуйста как сделать просто клик по координатам, я делаю так но ничего не выходит
 

Вложения

Anatoly79

Moderator
Регистрация
17.04.2020
Сообщения
474
Благодарностей
372
Баллы
63
  • Спасибо
Реакции: temavorobey

temavorobey

Client
Регистрация
28.07.2022
Сообщения
17
Благодарностей
1
Баллы
3
Регистрация
23.12.2014
Сообщения
646
Благодарностей
198
Баллы
43
Так нет как понимаю адекватного кода для плавного свайпа с ускорением (с с пролистыванием)?
Если что пишите в личку организуем с вознаграждением за труды)
 
Регистрация
23.12.2014
Сообщения
646
Благодарностей
198
Баллы
43
На моем телефоне, чтобы добиться инерции нужно вести пальцем не равномерно, а с ускорением. Т.е. начинаем медленно и постепенно наращиваем скорость.

Примерно так,
C#:
var droid = instance.DroidInstance;
int x1 = 360;
int y1 = 1100;
int x2 = 360;
int y2 = 300;
int step = 10;
int increaseStep = 10;
int delayMs = 5;

droid.Input.FingerDown(x1, y1);
for (int y = y1 + step; y > y2; y-=step)
{
    droid.Input.FingerMove(x1, y);
    Thread.Sleep(delayMs);

// Каждый следующий шаг длиннее предыдущего => скорость выше.
    step+=increaseStep;
}
droid.Input.FingerUp(x2, y2);
У Вас вообще задача свайпнуться "куда-нибудь вниз" ? Для этого можно использовать более интересные методы, например, поиск заведомо несуществующего элемента с пролистыванием экрана ScrollToElementByAccessibilityId:

C#:
var droid = instance.DroidInstance;
//Сколько раз крутануть экран
var count = 3;

try
{
droid.AppiumDriver.ScrollToElementByAccessibilityId("fake-id", count);
}
catch (System.Net.WebException e) when (e.Message.Contains("no such element")){
    // Элемент не существует, но нам это не важно
    return 0;
}
Первый код возможно ли доработать до 3 или 4 точек?
 

Anatoly79

Moderator
Регистрация
17.04.2020
Сообщения
474
Благодарностей
372
Баллы
63
Первый код возможно ли доработать до 3 или 4 точек?
Можно.
Включите в настройках для разработчика отображение касаний, чтобы линии рисовало.
Проведите пальцем по экрану так, как Вам нужно, только обязательно в том приложении, где нужен свайп с пролистыванием, чтобы было видно откуда начинается движение, его траектория и где заканчивается
Сделайте скрин.

103410
 
Регистрация
23.12.2014
Сообщения
646
Благодарностей
198
Баллы
43
По сути нужны косые линии , но самый важный фактор это небольшое ускорение для пролистывания
 
Регистрация
23.12.2014
Сообщения
646
Благодарностей
198
Баллы
43
Можно.
Включите в настройках для разработчика отображение касаний, чтобы линии рисовало.
Проведите пальцем по экрану так, как Вам нужно, только обязательно в том приложении, где нужен свайп с пролистыванием, чтобы было видно откуда начинается движение, его траектория и где заканчивается
Сделайте скрин.

Посмотреть вложение 103410
Вот для примераПосмотреть вложение IMG_20230319_120246.jpg
Посмотреть вложение IMG_20230319_120306.jpg
Посмотреть вложение IMG_20230319_120319.jpg
 

Вложения

Anatoly79

Moderator
Регистрация
17.04.2020
Сообщения
474
Благодарностей
372
Баллы
63
По сути нужны косые линии , но самый важный фактор это небольшое ускорение для пролистывания
Попробуем еще раз добиться нужного результата :-)

Попробуйте подобрать значения для свайпа. x1,y1 - начало; x2,y2 - конец
Координаты задаются в процентах от ширины/высоты, чтобы не привязываться к размеру дисплея. Начало координат - верхний левый угол.
Т.е. если ширина 1080, то 50% - это 540, 30% - 324 и т.д.
accelStart - это часть траектории после которой начинается ускорение "пальца" (по умолчанию с середины)


104898


Настройки только в шаблоне swipe. Вложенный проект скрыл, чтобы там случайно не изменить что-либо.
 

Вложения

Последнее редактирование:
Регистрация
23.12.2014
Сообщения
646
Благодарностей
198
Баллы
43
Попробуем еще раз добиться нужного результата :-)

Попробуйте подобрать значения для свайпа. x1,y1 - начало; x2,y2 - конец
Координаты задаются в процентах от ширины/высоты, чтобы не привязываться к размеру дисплея. Начало координат - верхний левый угол.
Т.е. если ширина 1080, то 50% - это 540, 30% - 324 и т.д.
accelStart - это часть траектории после которой начинается ускорение "пальца" (по умолчанию с середины)


Посмотреть вложение 104898

Настройки только в шаблоне swipe. Вложенный проект скрыл, чтобы там случайно не изменить что-либо.
В целом очень даже похоже....
Как понимаю это все основано на 3 точках (правильная косая линия), а если фигурка из 3 и более точек или косая линия "неправильная"?
 

Anatoly79

Moderator
Регистрация
17.04.2020
Сообщения
474
Благодарностей
372
Баллы
63
а если фигурка из 3 и более точек или косая линия "неправильная"?
split - сколько раз ломается линия движения (0 не ломается)
splitVar - насколько сильно ломается линия движения (от -500 до +500).
104967
 

Вложения

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)