如何模拟鼠标点击任何HTML元素(iframe,对象等)从Firefox扩展

How to simulate mouse click over any HTML element (iframe, obbject, etc) from Firefox extension?

本文关键字:iframe 对象 扩展 Firefox 元素 任何 模拟 何模拟 鼠标 HTML      更新时间:2023-09-26

在我的扩展中,我得到第一个标签的文档:

var doc  = gBrowser.getBrowserForTab(gBrowser.tabs[0]).contentDocument;         

文档包含iframe指向外国域,我怎么能模拟点击图像/对象在iframe内?

实际上,我想实现一个iMacros的X/Y点击功能。我该怎么做呢?

要模拟flash对象中的点击,您可能必须使用js-ctypes。

用javascript找到元素,获得元素screenX和screenY,然后添加DOMWindow的screenX和screenY(窗口可能调整为更小的窗口和移动),然后调用点击与js-ctypes。

在windows中是这样做的:

Components.utils.import("resource://gre/modules/ctypes.jsm");
var lib = ctypes.open("user32.dll");
var struct_Point = new ctypes.StructType("Point", [
  {"x": ctypes.int},
  {"y": ctypes.int}
]);
var GetCursorPos = lib.declare('GetCursorPos',
    ctypes.winapi_abi,
    ctypes.bool,
    struct_Point.ptr
);
/* Use it like this */
var point = new struct_Point;
var ret = GetCursorPos(point.address());
Components.utils.reportError(ret);
Components.utils.reportError(point);

这个页面有如何在mac os和linux中做到这一点:https://developer.mozilla.org/en-US/docs/Mozilla/js-ctypes/Standard_OS_Libraries


/*start setcursorpos*/
var SetCursorPos = lib.declare('SetCursorPos', ctypes.winapi_abi, ctypes.bool, ctypes.int, ctypes.int)
function doSetCursorPos() {
    var ret = SetCursorPos(10, 10);
}
/*end setcursorpos*/
/*start mouse_event*/
var mouse_event = lib.declare('mouse_event', ctypes.winapi_abi, ctypes.void_t, ctypes.uint32_t, ctypes.uint32_t, ctypes.uint32_t, ctypes.uint32_t, ctypes.uintptr_t);
var MOUSEEVENTF_LEFTDOWN = 2;
var MOUSEEVENTF_LEFTUP = 4;
function domouse_event() {
    var ret = mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
    var ret = mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
}
/*end mouse_event*/

那么这就是如何使用它。我在今年4月1日为stackoverflow制作了这个自动点击器。他们有一个flash游戏,玩家需要在巨石上点击70-120次才能获得独角兽分数。我以为你能解开别人锁定我的话题,但结果是骗局。但我从中得到了一些好东西。

像这样使用:

function clickXTimesWhereCursorIs(X, everyMs) {
        var point = new struct_lpPoint;
        var ret = GetCursorPos(point.address());
        Cu.reportError(ret);
        Cu.reportError(point);
    var ret = SetCursorPos(point.x, point.y);
    for (var i=0; i<X; i++) {
          setTimeout(function() {
       var ret = mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);      
       var ret = mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
          }, i*everyMs);
    }
}
setTimeout(function() {
    clickXTimesWhereCursorIs(90, 100);
}, 3000)

获取所讨论的元素的引用并在其上调用.click()

。像这样:

var elem = gBrowser.contentDocument.querySelector("a");
elem.click();