Как сделать двойной тап с помощью Appium v1.5.2?

java
appium
Теги: #<Tag:0x00007fedb830a4c8> #<Tag:0x00007fedb8309e88>

(Алексей Песоцкий) #1

В Appium 1.4.13 работал такой псевдокод:
JavascriptExecutor js = (JavascriptExecutor) dr; HashMap<String, Double> tapObject = new HashMap<String, Double>(); tapObject.put("x", x); tapObject.put("y", y); tapObject.put("duration", 0.0); // Время tapObject.put("touchCount", 1.0); // Пальцы tapObject.put("tapCount", 2.0); // Тапы js.executeScript("mobile: tap", tapObject);

В Appium 1.5.2 такой костыль убрали.
С помощью Multitouch используется одновременное нажатие несколькими пальцами, а как сделать двойной тап с помощью Multitouch и TouchAction я не совсем понимаю.
Может быть кто-то реализовывал двойной тап валидным способом для версии Appium 1.5.2?


(Yaroslav Pernerovskyy) #2

А что-то типа

TouchAction().tap(el).tap(el)perform();

не работает?


(Алексей Песоцкий) #3

ни так:
TouchAction s = new TouchAction(dr); s.tap(el).tap(el).perform();
ни так:
dr.performTouchAction(new TouchAction(dr).tap(el).tap(el));

кажется, только один раз тапает.


(Константин) #4

Посмотрите как в AppiumDriver реализован метод tap, кажется он вполне позволяет сделать двойной тап по элементу

  @Override public void tap(int fingers, WebElement element, int duration) {
    MultiTouchAction multiTouch = new MultiTouchAction(this);

    for (int i = 0; i < fingers; i++) {
        multiTouch.add(createTap(element, duration));
    }

    multiTouch.perform();
}

(Алексей Песоцкий) #5

Как я понял, это одновременный tap N пальцами, но мне же нужен последовательный тап. Или я не прав?

Вот так не получилось:

public void doubleTap() {
	WebElement el = dr.findElement(MobileBy.AccessibilityId("devicesBackground"));
	MultiTouchAction multiTouch = new MultiTouchAction(dr);
    for (int i = 0; i < 2; i++) {
        multiTouch.add(createTap(el, 500));
    }
    multiTouch.perform();
}

private TouchAction createTap(WebElement element, int duration) {
    TouchAction tap = new TouchAction(dr);
    return tap.press(element).waitAction(duration).release();
}

(Константин) #6

Может с параметром duration поиграться (увеличить, уменьшить) ?


(Yaroslav Pernerovskyy) #7

А если костыль в виде тап + пауза + тап ?


(Алексей Песоцкий) #8

Поигрался. На самом деле, так даже один тап не производится.


(Алексей Песоцкий) #9

как-то так не прокатило (и с ожидаем тут тоже поигрался):
TouchAction action = new TouchAction(dr); action.tap(el).waitAction(10).tap(el).perform();


(Yaroslav Pernerovskyy) #10

так тоже не ?

TouchAction action = new TouchAction(dr);

action.tap(el).perform();
sleep(200);
action.tap(el).perform();

(Алексей Песоцкий) #11

неа,
да и так собственно тоже:

TouchAction action = new TouchAction(dr); action.tap(el).perform(); action.tap(el).perform();


(Константин) #12

А элемент в вашем приложении точно реагирует на тапы? Или может не на тот элемент тапаете?
Руками то работает?


(Алексей Песоцкий) #13

руками работает)
тапаю по координатам и по элементу, эффект аналогичный


(Константин) #14

Android, IOS ?
Элемент по которому вы тапаете точно имеет свойство clickable, long-clickable ?


(Алексей Песоцкий) #15

Там немного сложнее, это невидимый элемент на плеере (двойной тап на плеере - переход в fullscreen).
Но суть в том, что по координатам (они высчитываются корректно) тоже не работает.


(Алексей Песоцкий) #16

может быть стоит дождаться версии 4.0.0, так как сейчас со swipe у меня тоже специфические проблемы?


FIX of TouchAction. Instances of the TouchAction class are reusable now FIX of the swiping issue (iOS, server version >= 1.5.0). Now the swiping is implemented differently by AndroidDriver and IOSDriver. Thanks to @truebit and @nuggit32 for the catching.


(Константин) #17

Ну может быть ваш плеер обернут в какой-нибудь лэйаут/вью и он как раз таки и clickable?
Походите по дереву элементов в инспекторе, посмотрите свойства лэйаутов и вьюх


(Алексей Песоцкий) #18

Плеер кликабелен, да, там всплывает controlPanel по одному тапу. Но ведь это не должно влиять на двойной тап? Темболее по координатам.


(Nmcreature) #19

А стандартный doubleTap() из XCode Automation не работает?
Example:
((JavascriptExecutor) getDriver()).executeScript(“target.frontMostApp().mainWindow().tableViews()[0].cells()[4].doubleTap()”);
Путь к элементу должен быть абсолютный (полный начиная с target).


(Алексей Песоцкий) #20

Я уже откатился к v1.4.13, в ней не работает (элемент точно есть):
JavascriptExecutor js = (JavascriptExecutor) dr; js.executeScript("target.frontMostApp().mainWindow().images()[\"devicesBackground\"]");