Appium Appium 中如何在 Chrome 浏览器中做 tap 的点击事件

lele · 2015年04月29日 · 最后由 达峰的夏天 回复于 2019年04月07日 · 2210 次阅读
本帖已被设为精华帖!

最近遇到一个用 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
        }

写的有点水,仅供参考吧!

共收到 3 条回复 时间 点赞

不错,受教了。以后遇到需要对元素注入 tap 事件可以这么用。

# 根据你的帖子,我的实现方法,亲测可以使用
WebElement el = driver.findElement(by);
((JavascriptExecutor) driver).executeScript("arguments[0].dispatchEvent(new CustomEvent('tap', {detail: {},bubbles: true,cancelable: true}));",el);

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册