最近遇到一个用 HBuilder 编写的 app,遇到 chromedriver 无法触发 webview 中的 tap 事件,经过查看 HBuilder 中的 mui.js 终于把问题解决了
看解决方法:
解读 mui.js
/**
* trigger event
* @param {type} element
* @param {type} eventType
* @param {type} eventData
* @returns {_L8.$}
*/
$.trigger = function(element, eventType, eventData) {
element.dispatchEvent(new CustomEvent(eventType, {
detail: eventData,
bubbles: true,
cancelable: true
}));
return this;
};
var dispatchEvent = function(event) {
var targetElement = $.targets.click;
if (targetElement) {
var clickEvent, touch;
// On some Android devices activeElement needs to be blurred otherwise the synthetic click will have no effect
if (document.activeElement && document.activeElement !== targetElement) {
document.activeElement.blur();
}
touch = event.detail.gesture.changedTouches[0];
// Synthesise a click event, with an extra attribute so it can be tracked
clickEvent = document.createEvent('MouseEvents');
clickEvent.initMouseEvent('click', true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null);
clickEvent.forwardedTouchEvent = true;
targetElement.dispatchEvent(clickEvent);
}
};
window.addEventListener('tap', dispatchEvent);
在 mui.js 中,tap 事件在这里做了二次封装,这样我们直接用 mui.js 的 tap 就可以
写法为:
java 中调用 js,找到元素
((JavascriptExecutor)driver).executeScript("找到元素.dispatchEvent(new CustomEvent('tap', {detail: {},bubbles: true,cancelable: true}));");
chromedriver 触发 webview 中的 tap 事件就可以实现了。
解释:
找到元素.dispatchEvent(new CustomEvent('tap', {detail: {},bubbles: true,cancelable: true}));
这里的 element 就是要找的元素,eventType 就是 tap
element.dispatchEvent(new CustomEvent(eventType, {
detail: eventData,
bubbles: true,
cancelable: true
}
写的有点水,仅供参考吧!