Пользовательский скрипт для нажатия кнопки «Обновить» каждую минуту, кроме случаев, когда есть ввод? - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь создать скрипт Tampermonkey, который бы нажимал кнопку «Обновить» на странице так часто, желательно каждую минуту.

Было бы еще лучше, если бы он мог приостановиться, пока вы выполняете другие действия на сайте, такие как набор текста, но это более необязательно.

Причина этого заключается в том, что мы используем веб-сайт на работе, который требует от нас своевременного отслеживания входящих запросов клиентов, но на сайте есть только встроенная кнопка обновления, которую нужно нажимать вручную, и она не обновляется автоматически. ,

Существуют плагины для браузера, которые делают то, что мне нужно, но они обновляют всю веб-страницу, что приводит к потере важной информации или настроек, которые были сделаны ранее. (это не происходит с кнопкой обновления на сайте).

Итак, я нашел setInterval и функцию .click. То, что я настроил, было следующее, которое иногда работало, а иногда нет. Но каждый раз, когда он работал, он не останавливался даже при отключении Tampermonkey.

// ==UserScript==
// @name         Ticket System - Auto Refresh
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://my*******.***.****mand.com/*
// @grant        none
// ==/UserScript==

setInterval(function () {document.getElementById("buttonOcLMZKwM8KoKda967hf2B0_11").click();}, 10000);

//end

Возможно, у меня есть некоторые существенные недостатки в том, что я сделал выше, но, как я уже сказал, у меня нет опыта работы с javascript. Также использовалось время для тестирования, чтобы быстро увидеть, работает ли он или нет.

Как вы, вероятно, можете видеть, я уже застрял в части обновления, поэтому остановка при вводе даже удаленно не выполняется.

Я также использовал

document.getElementById("buttonOcLMZKwM8KoKda967hf2B0_11")

и вполне вероятно, что цель потерпит неудачу, поскольку веб-сайт имеет тенденцию изменять этот идентификатор при повторном входе. Поэтому я попытался сделать это, используя вместо этого:

document.querySelector('[title="Refresh"]');

но, похоже, это не сработало вообще, хотя заголовок кнопки - Обновить.

Это полная кнопка HTML на сайте:

<button type="button" id="buttonOcLMZKwM8KoKda967hf2B0_11" data-sap-ui="buttonOcLMZKwM8KoKda967hf2B0_11" 
data-sap-automation-id="OcLMZKwM8KoKda967hf2B0" title="Refresh" role="button"
aria-disabled="false" tabindex="0" class="sapUiBtn sapUiBtnIconOnly sapUiBtnLite sapUiBtnS width-button-form sapUiBtnStd">
<img id="buttonOcLMZKwM8KoKda967hf2B0_11-img" src="https://.........TbRefresh.png" 
alt="Refresh" class="sapUiBtnIco"></button>

Я бы действительно оценил бы любую помощь , которую я могу получить.

1 Ответ

0 голосов
/ 29 апреля 2018

запуск и остановка опроса или интервального нажатия и т.д .; просто:

  1. Сохранить значение вызова setInterval().
    EG: var myTimer = setInterval (someFunction, 1000);
  2. Передайте это значение в clearInterval(), чтобы остановить цикл.
    EG: clearInterval (myTimer);

Конечно, пользовательский интерфейс - самая сложная часть. Мне нравится:

  1. Поместите кнопку состояния и управления в верхнем правом углу экрана.
  2. Привязать сочетание клавиш, чтобы иметь возможность переключать цикл без необходимости мыши.

Следующий пользовательский скрипт выполняет все вышеперечисленное, плюс:

  1. Нажмите кнопку «Обновить» на каждой итерации цикла.
  2. Останавливает / возобновляет цикл при нажатии кнопки управления.
  3. Останавливается / перезапускается при нажатии F9 (в зависимости от того, где находится фокус).
  4. Останавливает цикл при выборе или вводе одного из элементов управления формы.
  5. Перезапускает цикл при нажатии кнопки «Обновить».

Вот полный рабочий сценарий пользователя (это просто часть над блоком ******.).
Чтобы увидеть его в действии, запустите фрагмент кода.

// ==UserScript==
// @name     _Click button regularly, with start/stop controls
// @match    *://YOUR_SERVER.COM/YOUR_PATH/*
// @require  https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @grant    GM_addStyle
// ==/UserScript==

//--- Initialize the refresh button loop and controls.
var rfrshBtnSel = 'button[title="Refresh"]';  //  jQuery selector for the refresh
var rfrshTmr    = LoopManager (clickRefreshButton, 1000);  //  1000 ms == 1 second.
var loopStBtn   = LoopButtonManager (rfrshTmr.toggle);

rfrshTmr.setCallbacks (loopStBtn.start, loopStBtn.stop, loopStBtn.error);
rfrshTmr.start ();  //  Start looping the refresh btn click.

$(window).keydown (keyboardShortcutHandler);

//--- On use of certain form controls, stop the refresh timer:
$("body").on (
    "click keydown focus paste scroll", "input, textarea, select", rfrshTmr.stop
);
//--- On click of the refresh button, (re)start the refresh timer:
$("body").on ("click", rfrshBtnSel, rfrshTmr.start);

function clickRefreshButton () {
    var refreshBtn = $(rfrshBtnSel);
    if (refreshBtn.length === 1)  clickNode (refreshBtn);
    else loopStBtn.error ("Refresh button not found!");
}
function keyboardShortcutHandler (zEvent) {
    if (zEvent.which == 120) {  //  On F9, Toggle the Loop state.
        rfrshTmr.toggle ();
        return false;
    }
    return true;
}
function clickNode (jNode) {
    var clickEvent  = document.createEvent ('MouseEvents');
    clickEvent.initEvent ('click', true, true);
    jNode[0].dispatchEvent (clickEvent);
}

function LoopManager (callbackFnc, intrvlMillisec, bAutoStart, ...optParams) {
    var _thisInterval = null;
    var _startCB = null, _stopCB = null, _errorCB = null;
    if (bAutoStart)  _start ();

    function _start () {
        if ( ! _thisInterval) {
            _thisInterval = setInterval (callbackFnc, intrvlMillisec, ...optParams);
        }
        if (_startCB)  _startCB ();
    }
    function _stop () {
        clearInterval (_thisInterval);
        _thisInterval = null;
        if (_stopCB)  _stopCB ();
    }
    function _toggle () {
        if (_thisInterval)  _stop ();
        else                _start ();
    }
    function _setCallbacks (startCB, stopCB, errorCB) {
        _startCB = startCB; _stopCB = stopCB; _errorCB = errorCB;
    }
    return {
        start: _start,  stop: _stop,  setCallbacks: _setCallbacks,  toggle: _toggle
    };
}
function LoopButtonManager (clickCB) {
    var _btnNode = $('#tmStartStopBtn');
    if (_btnNode.length === 0) {
        _btnNode = $( `
            <button id="tmStartStopBtn" type="button" class="tmRefreshRunning">
                <span>TBD</span> (F9)
            </button>
        ` ).appendTo ("body");
    }
    var _spanNode = _btnNode.find ("span");

    _btnNode.click (clickCB);

    function _start () {
        setButtonDisplay ("Running", "tmRefreshRunning");
    }
    function _stop () {
        setButtonDisplay ("Stopped", "tmRefreshStopped");
    }
    function _error (errMess) {
        console.error ("TM: " + errMess);
        setButtonDisplay ("See console!", "tmError");
    }
    function setButtonDisplay (btnText, btnClass) {
        _spanNode.text (btnText);
        _btnNode.removeClass ();
        if (btnClass)  _btnNode.addClass (btnClass);
    }
    return { start: _start,  stop: _stop,  error: _error };
}
GM_addStyle ( `
    #tmStartStopBtn {
        position:           absolute;
        top:                0;
        right:              0;
        font-size:          18px;
        margin:             5px;
        opacity:            0.9;
        z-index:            1100;
        padding:            5px 20px;
        color:              black;
        cursor:             pointer;
    }
    .tmRefreshRunning { background: orange; }
    .tmRefreshStopped { background: lime; }
    .tmError { background: red; }
` );

/********************************************************************
******* Everything below this block is simulated target page. *******
******* It's NOT part of the userscript.                      *******
********************************************************************/
$('button[title="Refresh"]').click ( function () {
    $(this).attr ("id", 'spelunk' + Math.random () );
    $("#StatusNd").text ("Refreshed: " + (new Date() + '').replace (/\s*\(.+\)/, "") );
} );
div {
    margin: 0 0 1ex 1em;
    width: 20em;
    padding: 0.5ex 1em 0 1em;
    border: 1px solid darkgreen;
    border-radius: 1ex;
}
label { margin: 0 0 0 2em; }
label[for="Bar"] { display: inline-block;  vertical-align: top; }
button, #StatusNd { margin: 0 0 1ex 2em; }
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script src="https://greasyfork.org/scripts/44560-gm-addstyle-shim/code/GM_addStyle_shim.js"></script>
<p>This userscript will click the "Refresh" button every second,<br> unless typing in an input.</p>
<div>Some inputs:<br>
    <label>Foo: <input type="text" id="Foo"></label><br><br>
    <!-- <label for="Bar">Bar: </label>
    <textarea id="Bar"></textarea> -->
</div>
<button type="button" id="some_random_ID" title="Refresh">Refresh</button>
<p id="StatusNd"></p>
...