Метод HTMLElement.click() выдаёт неизвестную ошибку

Рейтинг: 0Ответов: 1Опубликовано: 14.03.2023

Целью написания скрипта была автоматическая авторизация на web-интерфейсе (браузер не сохранял логины и пароли).

Изначально с помощью chatgpt был создан такой скрипт:

// ==UserScript==
// @name         Авторизация на МКСЗ
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Автоматическая авторизация на web-интерфейсе МКСЗ
// @author       nikgun61
// @match        *://*/*
// @grant        none
// ==/UserScript==

(function() {
    console.log("Скрипт начал свою работу.");
    'use strict';

    // Список сайтов и соответствующих им логинов и паролей
    var sites = {
        "example.com": {login: "log1", password: "pass1"},
        "example.org": {login: "log2", password: "pass2"}
    };

    // Функция для ввода логина и пароля на странице авторизации
    function enterCredentials(login, password) {
        var input_login = document.querySelector('input[autocomplete="username"]');
        var input_password = document.querySelector('input[autocomplete="current-password"]');
        if (input_login && input_password) {
            input_login.value = login;
            input_password.value = password;
            document.getElementsByTagName("button")[0].click();

        } else {
            console.log("Не удалось найти поля для ввода логина и пароля.");
        }
    }

    // Функция для проверки, загружена ли страница полностью
    function isPageLoaded() {
        return document.readyState === "complete";
    }

    // Функция для авторизации на сайте
    function loginToSite(site) {
        console.log("Сайт найден в списке");
        // Получаем логин и пароль для сайта
        var login = sites[site].login;
        var password = sites[site].password;
        // Вводим логин и пароль на странице авторизации
        enterCredentials(login, password);
    }

    // Получаем имя хоста текущего URL
    var currentHost = window.location.hostname;
    console.log("Получено имя хоста:", window.location.hostname);

    // Проверяем, загружена ли страница полностью
    if (isPageLoaded()) {
        // Ищем сайт в списке
        for (var site in sites) {
            if (site === currentHost) {
                loginToSite(site);
                break;
            }
        }
    } else {
        // Ждем, пока страница загрузится полностью, затем ищем сайт в списке
        window.onload = function() {
            for (var site in sites) {
                if (site === currentHost) {
                    loginToSite(site);
                    break;
                }
            }
        }
    }
})();

В целом он работал, однако в процессе загрузки сайта он сталкивался с предупреждением "Mixed Content" и из-за этого скрипт не мог вставить логин и пароль. Проблема решалась банальной перезагрузкой сайта.

введите сюда описание изображения

Чтобы решить проблему я переписал скрипт. В случае, если отсутствует возможность вставить логин и пароль, он автоматически перезагружает страницу. Так же помимо самого web-адреса он проверяет, является текущая страница авторизацией (чтобы web-интерфейс постоянно не перезагружался).

// ==UserScript==
// @name         Авторизация на МКСЗ
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  Автоматическая авторизация на web-интерфейсе МКСЗ
// @author       nikgun61
// @match        *://*/*
// @grant        none
// ==/UserScript==

(function() {
    console.log("Скрипт начал свою работу.");
    'use strict';

    // Список сайтов и соответствующих им логинов и паролей
    var sites = {
        "example.com": {login: "log1", password: "pass1"},
        "example.org": {login: "log2", password: "pass2"}
    };

    // Ожидание конца загрузки сайта
    console.log("Ожидается загрузка сайта");
    window.onload = console.log("Сайт загружен, начинается проверка URL ", window.location.href);;

    //Проверка на совпадение со списком сайтов
    for (var site in sites){
        console.log("Проверка URL ", site, "/?&wtd")
        if (window.location.href.includes(site) && window.location.href.includes('/?&wtd')){
            console.log("Совпадение найдено");

            //Начинаем авторизацию
            var login = sites[site].login;
            var password = sites[site].password;
            var input_login = document.querySelector('input[autocomplete="username"]');
            var input_password = document.querySelector('input[autocomplete="current-password"]');
            if (input_login && input_password) {
              input_login.value = login;
                input_password.value = password;
        document.getElementsByTagName("button")[0].click();
            } else {
                console.log("Не удалось найти поля для ввода логина и пароля.");
                //перезагрузка страницы на случай ошибки Mixed Content
                location.reload();
            }

            break;
        }
        console.log("Совпадение не найдено");
    }

})();

И в результате работы второго скрипта выдаётся следующая ошибка: введите сюда описание изображения

Объясните, пожалуйста, почему при использовании одного и того же метода document.getElementsByTagName("button")[0].click(); в одном скрипте возникает ошибка, а в другом - нет? И как это исправить?

Ответы

▲ 0

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