Метод HTMLElement.click() выдаёт неизвестную ошибку
Целью написания скрипта была автоматическая авторизация на 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();
в одном скрипте возникает ошибка, а в другом - нет? И как это исправить?