2

我创建了以下greasemonkey 脚本来自动跳过蒸汽时代检查页面:

// ==UserScript==
// ...
// @include     http://store.steampowered.com/agecheck/*
// ==/UserScript==

//Mini script for doing steam age checks automatically
if( document.URL.indexOf('agecheck') > -1 )
{
    var form = document.getElementById('agegate_box').getElementsByTagName('form')[0];
    form.ageDay.value = 18;
    form.ageMonth.value = 'August';
    form.ageYear.value = 1987;
    form.submit();
}

这种页面的一个例子是:http ://store.steampowered.com/agecheck/app/16730/ 。请注意,如果您设置了“生日”cookie,此页面将自动跳至游戏store.steampowered.com,因此您可能必须先将其删除。

当在 Windows XP 上运行的 Firefox 17.0 (beta) 上安装这个greasemonkey 脚本时,它可以正常工作。

然后,我在运行最新 FF (16) 的 Windows 7 机器上安装了该脚本。在这台机器上,脚本在访问 form.ageDay 时中断。错误控制台显示:

Error: form.ageDay is undefined

更奇怪的是,如果我只是将我的脚本粘贴到 Firefox Scratchpad (Shift+F4) 并执行它,它就可以找到并提交表单。

怎么可能在 XP 上 GM 脚本有效,而在 Win7 中,脚本在暂存器中有效,但在 Win7 上,脚本在 GM 中无效?

另一个奇怪的是,在Win7机器上,如果我激活Firebug,var form显然有一个'ageDay'属性,但手表表达式返回未定义?

在此处输入图像描述

4

1 回答 1

1

该代码在 Windows XP 或 Windows 7 上都不适用于我。也不应该。GM 脚本不能(通常)使用这样的命名表单对象。请参阅Greasemonkey 陷阱:命名表单和表单元素

使用沙盒安全(和更强大)的方法来获取这些表单元素。例如,querySelector()。此脚本在您链接的页面上适用于我:

// ==UserScript==
// @name        _delme 677
// @include     http://store.steampowered.com/agecheck/*
// @grant       GM_xmlhttpRequest
// ==/UserScript==

//Mini script for doing steam age checks automatically
if (/agecheck/i.test (location.pathname) ) {
    var ageForm = document.querySelector ("#agegate_box form");
    ageForm.querySelector ("[name='ageDay']").value     = 18;
    ageForm.querySelector ("[name='ageMonth']").value   = 'August';
    ageForm.querySelector ("[name='ageYear']").value    = 1987;
    ageForm.submit ();
}

笔记:

  1. Firefox Scratchpad 之所以有效,是因为它没有被 GM 沙箱隔离。
  2. 至于为什么它似乎可以在 Win XP 上运行,这很可能是侥幸——它在 XP 上对我不起作用,也不应该。

    在某些@grant none情况下,这种代码可能会起作用。(@grant none在许多情况下默认应用;请参阅文档。)

    或者可能有多个版本的脚本在运行,甚至 FF 已损坏并需要重新启动。

    最重要的是,不要那样编码。

  3. 至于but the watch expression returns undefined?...这只是工作中的沙盒隔离,在我看来,它在 XP 上看起来是一样的。

  4. 像上面这样使用的代码querySelector()几乎可以在用户可能遇到的每个页面上工作,而且它肯定在这个问题的参数范围内工作。但它目前不适用于某些可能的HTML5 表单和一些据称用于某些网站的无效HTML。

    在这两种情况下,我在上面给出的陷阱链接中提到的代码都可以工作,尽管存在某些无效的 HTML 或最新的 HTML5 提议的功能。

    具体来说,这种代码虽然不如 灵活,但querySelector适用于更广泛的场景(即使它们是无效的 HTML):

    if (/agecheck/i.test (location.pathname) ) {
        var ageForm = document.querySelector ("#agegate_box form");
        ageForm.elements.namedItem ('ageDay').value     = 18;
        ageForm.elements.namedItem ('ageMonth').value   = 'August';
        ageForm.elements.namedItem ('ageYear').value    = 1987;
        ageForm.submit ();
    }
    
于 2012-10-31T22:30:10.540 回答