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

时间:2014-07-24 14:51:26

标签: javascript iframe click firefox-addon xul

在我的扩展程序中,我获得了第一个标签的文档:

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

doc包含指向外域的iframe,如何模拟iframe中的图像/对象点击?

实际上,我想实现iMacros'的功能。 X / Y点击。我该怎么办?

2 个答案:

答案 0 :(得分:2)

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

使用javascript找到元素,获取元素screenX和screenY,然后添加DOMWindow的screenX和screenY(窗口可能会调整为更小的窗口并移动),然后使用js-ctypes调用click。

这是在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次获得独角兽点数。我以为你可以解锁人们锁定我的主题,但事实证明这是骗局。但得到了一些好的ctypes。

像这样使用:

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)

答案 1 :(得分:0)

只需获取相关元素的引用并在其上调用.click()

E.g。像这样的东西:

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