Простой, немедленный ответ:
Причина, по которой window.location
не работает для вас, заключается в том, что:
- Вызов
window.location
выполняется внутри окна load
обработчик событий.
- Эта целевая страница является одной из тех, где
load
событие срабатывает почти сразу после события DOMContentLoaded
.
- По умолчанию пользовательские сценарии срабатывают на
DOMContentLoaded
, но в этом случае событие загрузки уже сработало к моменту запуска сценария.
Реальный ответ:
Есть много проблем с этим кодом вопроса:
- Это не отслеживание и учет состояния процесса. Сценарий запускается на многих (видах) страницах и должен вести себя по-разному в зависимости от состояния.
- Страница (ы) в основном AJAX. Код неправильно учитывает это.
- Событие загрузки не особенно полезно в этом сценарии.
- Вышеупомянутое, сценарий стрельбы против нагрузки, состояние гонки.
- Жесткое кодирование учетных данных для входа в подобный скрипт означает, что вы получите pwned, вопрос только в том, когда и сколько урона.
Необходимо отслеживать и различать как минимум 3 различных состояния, используя комбинацию URL-адресов страниц и / или ключевых узлов на страницах и / или переменных состояния, которые сценарий сохраняет / передает.
Следующий сценарий пользователя иллюстрирует этот процесс, хотя я не могу проверить его на сайте, и рекомендуемая структура аутентификации для простоты опущена. :
// ==UserScript==
// @name _Login and then redirect an AJAX-driven page
// @include https://tramites.saime.gob.ve/*
// @require https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant GM_addStyle
// @grant GM.getValue
// ==/UserScript==
//- The @grant directives are needed to restore the proper sandbox.
//--- Different pages require different actions
if (location.search.includes ("site/login") ) { // initial login page
//-- Wait for page to initialize
waitForKeyElements ("#login_button:visible", loginWhenReady);
}
else if (location.search.includes ("tramite/tramite") ) { // successful login page
//-- Just redirect
location.assign ("https://tramites.saime.gob.ve/index/example/example");
}
else {
//-- All other pages, no action needed.
}
function loginWhenReady (jNode) {
//-- Demo purposes only! Use framework or password manager instead!
$("#LoginForm_username").val ("user");
$("#LoginForm_password").val ("1234");
clickNode (jNode); // Login button passed in by WFKE
}
function clickNode (jNode) {
var clickEvent = document.createEvent ('MouseEvents');
clickEvent.initEvent ('click', true, true);
jNode[0].dispatchEvent (clickEvent);
}
Возможное быстрое и простое решение:
- If-and-only-if (IIF) страница входа в систему всегда
https://tramites.saime.gob.ve/index.php?r=tramite/tramite/
.
- И если эта страница используется ни для чего другого, что вас волнует ...
Тогда для ваших нужд может быть достаточно следующего пользовательского сценария:
// ==UserScript==
// @name _Quick and dirty post login redirect
// @include https://tramites.saime.gob.ve/index.php?r=tramite/tramite*
// @grant none
// @run-at document-start
// ==/UserScript==
location.replace ("https://tramites.saime.gob.ve/index/example/example");