Javascript-форум (https://javascript.ru/forum/)
-   Firefox/Mozilla (https://javascript.ru/forum/css-html-firefox-mizilla/)
-   -   Скрипт выбора radiobutton и клик по кнопке (Greasemonkey) (https://javascript.ru/forum/css-html-firefox-mizilla/81701-skript-vybora-radiobutton-i-klik-po-knopke-greasemonkey.html)

The_Immortal 15.01.2021 01:52

Скрипт выбора radiobutton и клик по кнопке (Greasemonkey)
 
Всех приветствую!

Прошу простить, если пишу не тут, просто не нашёл более подходящего форума для данного вопроса...

Пытаюсь написать Greasemonkey-скрипт, который должен ставить true для определенного radiobutton'а и далее кликать по определенной кнопке (хотя она на странице единственная). После успешной операции открывается другая страница, после чего надо вернуться на предыдущую и всё заново повторить (выбрать нужное "радио" и кликнуть по кнопке) - т.е. организовать цикл.

До возврата на предыдущую страницу и цикл я пока не дошёл, т.к. банально не могу выбрать "радио" и кликнуть по кнопке.
<input type="radio" name="thisradio" value="123">
<input type="submit" onclick="send(); return false;" value="Запустить">


Мои попытки:
// ==UserScript==
// @name     Скрипт БезИмени 648414
// @version  1
// @grant       GM_openInTab
// @grant       unsafeWindow
// @run-at      document-start
// ==/UserScript==

waitForKeyElements ("input[name='thisradio'][value='123']", selectRadioButton, true);

function selectRadioButton (jNode) {
   jNode.prop ('checked', true);
}

//$("input[name='thisradio'][value='123']").prop ('checked', true);

document.getElementByValue("Запустить").dispatchEvent(new MouseEvent('click'));


Подскажите, пожалуйста, что я делаю не так?.. :-?

Спасибо!

рони 15.01.2021 02:02

Цитата:

Сообщение от The_Immortal
getElementByValue

где почитать про это?

The_Immortal 15.01.2021 02:07

рони, да до "этого" вообще дело не доходит - radiobutton не выбирается :(

рони 15.01.2021 02:16

Цитата:

Сообщение от The_Immortal
выбрать "радио" и кликнуть по кнопке.

document.querySelector('[name="thisradio"][value="123"]').checked = true;
document.querySelector('[value="Запустить"]').dispatchEvent(new MouseEvent('click'));

The_Immortal 15.01.2021 02:40

рони, благодарю за подсказку, но не сиё робит... :(

Хотя если открыть консоль браузера, то срабатывает...

Aetae 15.01.2021 03:51

@run-at      document-start
тут лишнее. Код запускается до того как какие-либо кнопки появятся в документе.

The_Immortal 15.01.2021 17:40

Aetae, большое спасибо!



Цитата:

Сообщение от рони
document.querySelector('[value="Запустить"]').dispatchEvent(new MouseEvent('click'));

Почему-то эта кнопка срабатывает не так, как если кликать по ней. По коду выше выдается страница, где сообщается, что radiobutton не выбран... Если же вручную щелкнуть, то всё нормально срабатывает. Можно ли как-то запустить то, что указано на самой кнопке, т.е. вот это:
onclick="send(); return false;"
?

рони 15.01.2021 18:24

The_Immortal,
send(); вместо всей строки

The_Immortal 16.01.2021 00:23

рони, я же правильно понял:
// ==UserScript==
// @name     Скрипт БезИмени 648414
// @version  1
// @grant       unsafeWindow
// @grant       GM_openInTab
// ==/UserScript==

document.querySelector('[name="thisradio"][value="123"]).checked = true;
send();
? Так нужный radio выбирается, но кнопка не срабатывает...
Пробовал так:
// ==UserScript==
// @name     Скрипт БезИмени 648414
// @version  1
// @grant       unsafeWindow
// @grant       GM_openInTab
// ==/UserScript==

document.querySelector('[name="thisradio"][value="123"]).checked = true;
send();
return false;
- тоже не хочет :(

А из-под консоли send(); срабатывает как надо...

рони 16.01.2021 00:29

The_Immortal,
ну попробуйте кликнуть дважды
document.querySelector('[name="thisradio"][value="123"]').dispatchEvent(new MouseEvent('click'));
document.querySelector('[value="Запустить"]').dispatchEvent(new MouseEvent('click'));

The_Immortal 16.01.2021 00:37

рони,
Цитата:

Сообщение от рони
кликнуть дважды

А так происходит, что и ранее:
Цитата:

Сообщение от The_Immortal
По коду выше выдается страница, где сообщается, что radiobutton не выбран

В консоли при этом выводится ошибка:
TypeError: document.querySelector(...) is null


На send(); (если из-под скрипта), кстати, в консоли пишется:
Цитата:

ReferenceError: send is not defined
Пробовал ещё вот так:
document.querySelector('[value="Запустить"]').form.submit();
Также ошибка "radiobutton не выбран":
TypeError: document.querySelector(...) is null

---

Нашел на странице саму функцию send:
function send(){

    var frm = document.mychance;
	var chance_type = '';

    for (var i=0;i < frm.elements.length;i++) {
        var elmnt = frm.elements[i];
        if (elmnt.type=='radio') {
            if(elmnt.checked == true){ chance_type = elmnt.value; break;}
        }
    }

	var ajax = new tbdev_ajax();
	ajax.onShow ('');
	var varsString = "";
	ajax.requestFile = "mybchance.php";
	ajax.setVar("id", chance_type);
	ajax.method = 'POST';
	ajax.element = 'ajax';
	ajax.sendAJAX(varsString);
}
Запихнул её в скрипт и получил ошибку:
ReferenceError: tbdev_ajax is not defined

---

Урааа!!! Вот где была собака зарыта:
<script language="javascript" type="text/javascript" src="js/ajax.js"></script>


Пока получилось вот так:
// ==UserScript==
// @name     Скрипт БезИмени 648414
// @version  1
// @grant       unsafeWindow
// @grant       GM_openInTab
// @run-at   document-end
// @require [url]https://somewww.org/js/ajax.js[/url]

function send(){

    var frm = document.mychance;
	var chance_type = '';

    for (var i=0;i < frm.elements.length;i++) {
        var elmnt = frm.elements[i];
        if (elmnt.type=='radio') {
            if(elmnt.checked == true){ chance_type = elmnt.value; break;}
        }
    }

	var ajax = new tbdev_ajax();
	ajax.onShow ('');
	var varsString = "";
	ajax.requestFile = "mybchance.php";
	ajax.setVar("id", chance_type);
	ajax.method = 'POST';
	ajax.element = 'ajax';
	ajax.sendAJAX(varsString);
}

document.querySelector('[name="thisradio"][value="123"]').dispatchEvent(new MouseEvent('click'));
send();


Цитата:

Сообщение от The_Immortal
После успешной операции открывается другая страница, после чего надо вернуться на предыдущую и всё заново повторить (выбрать нужное "радио" и кликнуть по кнопке) - т.е. организовать цикл.

Оказалось, что достаточно переинициализировать страницу:
location.reload();
return false;
Но я вот не могу понять каким образом организовать цикл, к примеру, чтобы скрипт выполнялся 10 раз? Надо какую-то глобальную переменную заводить как-то...


Часовой пояс GMT +3, время: 00:59.