为什么这个用户只做第一个if?

时间:2017-12-07 15:54:40

标签: javascript userscripts tampermonkey

我正在处理用户脚本,但它似乎仅适用于第一次比较:

(function() {
'use strict';

var noError = document.getElementsByClassName("noMistakeButton");
var next = document.getElementsByClassName("nextButton");
var wait = document.getElementsByClassName("understoodButton");
var okko = document.getElementsByClassName("buttonKo");
var exitOkko = document.getElementsByClassName("exitButton");

while(1)
{
    if( noError !== null)
    {
        noError.click();
    }

    if( next !== null)
    {
        exit.click();
    }

    if( wait !== null)
    {
        wait.click();
    }
    sleep(2);
    if( okko !== null)
    {
        exit.click();
    }

    if( exitOkko !== null)
    {
        exitOkko.click();
    }

} })();

我的目标是在AFK时自由运行此脚本。 正如您所看到的,网页上有许多按钮,每个按钮都不能是:可见或隐藏。我的目标就是点击它们。

Here is the target page (static URL)

有些按钮只有类,没有ID。其他人都有他们两个。

控制台报告:

  

错误:执行脚本'AutoVoltair'失败! noError.click不是   功能

1 个答案:

答案 0 :(得分:0)

目前还不清楚你希望实现什么目标。如果您尝试单步执行一系列控件,请使用Choosing and activating the right controls on an AJAX-driven site中所示的方法。

问题中显示的代码类型只会播放“Whac-A-Mole”,其下一个按钮“弹出”。 (并且只有删除了前面的按钮。)

无论如何,回答这个问题:“为什么这段代码只做第一个if?”。

这是因为用户脚本(和javascript)在第一个严重错误(除少数例外)时停止运行。此外:

  • noError.click不是函数,因为noError is a collection of elements, not a button
  • 所有getElementsByClassName次来电只进行一次。如果它将继续循环,你需要在循环内重新检查。
  • 没有sleep()这样的东西。
  • while (1)是一个非常糟糕的主意,可以冻结您的浏览器,甚至可以帮助您的PC崩溃。使用setInterval进行页面轮询。

以下是修正了这些错误的“Whac-A-Mole”代码:

setInterval ( () => {
        var noError     = document.getElementsByClassName ("noMistakeButton");
        var next        = document.getElementsByClassName ("nextButton");
        var wait        = document.getElementsByClassName ("understoodButton");
        var okko        = document.getElementsByClassName ("buttonKo");
        var exitOkko    = document.getElementsByClassName ("exitButton");

        if (noError.length) {
            noError[0].click ();
        }
        if (next.length) {
            next[0].click ();
        }
        if (wait.length) {
            wait[0].click ();
        }
        if (okko.length) {
            okko[0].click ();
        }
        if (exitOkko.length) {
            exitOkko[0].click ();
        }
    },
    222  //  Almost 5 times per second, plenty fast enough
);


如果您想对点击次数进行排序,请使用this answer中所示的链式waitForKeyElements()来电