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);
}
}