WebView GetHitTestResult() показывает предыдущий узел при моделировании щелчков мыши

Мне нужно смоделировать нажатие на узлы на страницах HTML внутри Android WebView, а затем записать, какой узел был нажат. Тем не менее, когда я звоню GetHitTestResult от OnTouchEvent в моем подклассе WebView вместо того, чтобы показывать узел, на который только что щелкнули, он показывает узел, на который щелкнули непосредственно перед этим щелчком. (т. е. начните с выбранного узла редактирования, затем щелкните по поддельному клику на Image1.png и GetHitTestResult в OnTouchEvent показывает оригинальный узел редактирования, а не "Image1". Если вы затем нажмите Image2.png, GetHitTestResult показывает "Image1". Затем нажмите на что-то еще, и это показывает "Image2".)

Фактические щелчки мышью показывают правильный узел - только с помощью моих смоделированных щелчков GetHitTestResult показывает неправильный узел. (При реальных щелчках мыши событие "Вниз" показывает предыдущий узел, а событие "Вверх" показывает текущий / правильный узел.) К сожалению, я не имею никакого контроля над большинством веб-страниц, поэтому могу только обнаружение узла из моего кода регистрации.

Нужно ли вызывать что-то между симулируемым щелчком "Вниз" и симулированным щелчком "Вверх", чтобы изменение узла распознавалось Android / Xamarin / виджетом WebView? (Кстати: это в Xamarin.Android.) Или есть ли в Android какой-либо способ заставить его обрабатывать любые выдающиеся DispatchTouchEvent события, которые все еще могут ожидаться в потоке пользовательского интерфейса? (Возможно, проблема вызвана чем-то, что не было обработано между фальшивым щелчком "Вниз" и фальшивым кликом "Вверх"?)

C# Нажав код:

void ClickThePage(WebView webView, float left, float top) {

    long downTime = Android.OS.SystemClock.UptimeMillis();
    long eventTime = Android.OS.SystemClock.UptimeMillis() + 100;
    MotionEvent motionEventDown = MotionEvent.Obtain(
        downTime, eventTime, MotionEventActions.Down,
        left, top, (MetaKeyStates)0x0
    );

    downTime = Android.OS.SystemClock.UptimeMillis() + 200;
    eventTime = Android.OS.SystemClock.UptimeMillis() + 300;
    MotionEvent motionEventUp = MotionEvent.Obtain(
        downTime, eventTime, MotionEventActions.Down,
        left, top, (MetaKeyStates)0x0
    );

    // actually do the "Click"
    webView.DispatchTouchEvent (motionEventDown);
    System.Threading.Thread.Sleep (50);
    webView.DispatchTouchEvent (motionEventUp);

    motionEventDown.Recycle ();
    motionEventUp.Recycle ();
}

Код захвата кликов:

public class SAWebView : WebView {
    ...
    public override bool OnTouchEvent (MotionEvent e) {
        Console.WriteLine("[SAWebView]: OnTouchEvent: Action = " + e.Action + 
            "\n HitTestResult.Type = " + GetHitTestResult().Type +
            "\n HitTestResult.Extra = " + GetHitTestResult().Extra);
        return base.OnTouchEvent (e);
    }
}

0 ответов

Другие вопросы по тегам