Знаете, как отличить настоящий клик (который отправлен реальной мышкой) от фальшивого (эмулированного при помощи скрипта)?
.isTrusted
да, да.
настоящему клику всегда можно верить.
Как бы вы не пытались вызвать клик там где его не ждут
И что скажете вы, его никак нельзя подделать?
element.click() не прокатывает
element.dispatchEvent(new MouseEvent('mousedown', {
view: window,
bubbles: true,
cancelable: true
}));
element.dispatchEvent(new MouseEvent('mouseup', {
view: window,
bubbles: true,
cancelable: true
}));
Тоже, хотя казалось бы все нужные блоки для этого заготовлены как раз должны быть.
На помощь могут придти само собой языки более высокого порядка, такие как python, которые могут работать с мышью целиком. Либо headless chrome хорошо справляется с этим
Об этом я не буду рассказывать
А расскажу я о том, как эмулировать настоящий клик при помощи расширения для хрома. Такой метод гарантирует, что мышка не выйдет за пределы браузера и не взбунтует против хозяина (ну вы знаете эти роботы так и хотят восстать против человеков)
Нам понадобится изготовить расширение для хрома (для других браузеров скорее всего механизмы будут чуть другими)
Если вы не знаете как пишутся расширения - то рекомендую изучить этот вопрос самостоятельно, здесь будет упор на то что у вас есть минимальные представления о расширении и вы уже написали что-нибудь уровня hello-world
В файл манифеста прописываем права на дебаггер
"permissions": [
"debugger"
],
Далее в файле background.js активируем режим отладки
chrome.webNavigation.onCompleted.addListener(function(navigation) {
chrome.debugger.attach({ tabId: navigation.tabId }, "1.3");
}
(программе ведь надо знать на какой вкладке включаться - на активной разумеется, вам скорее всего также понадобятся права на работу с вкладками)
Далее сами функции вызова клика по координатам выглядят вот так
chrome.debugger.sendCommand({ tabId: sender.tab.id }, "Input.dispatchMouseEvent",
{ type: "mousePressed", x: request.x, y: request.y, button: "left", clickCount: 1 })
chrome.debugger.sendCommand({ tabId: sender.tab.id }, "Input.dispatchMouseEvent",
{ type: "mouseReleased", x: request.x, y: request.y, button: "left", clickCount: 1 })
Собственно всё
если хотите вызывать клики из вкладки - то чтобы обратиться к background.js - нужно использовать listner
например так
chrome.runtime.onMessage.addListener(
function (request, sender) {
if (request.event === "mouseClick") {
chrome.debugger.sendCommand({ tabId: sender.tab.id }, "Input.dispatchMouseEvent",
{ type: "mousePressed", x: request.x, y: request.y, button: "left", clickCount: 1 })
chrome.debugger.sendCommand({ tabId: sender.tab.id }, "Input.dispatchMouseEvent",
{ type: "mouseReleased", x: request.x, y: request.y, button: "left", clickCount: 1 })
}
}
)
и вызывать его например так из тела расширения
chrome.runtime.sendMessage({
event: "mouseClick",
x: 100,
y: 100,
})
Вот этот клик будет засчитан как настоящий
Учитывайте, что клик засчитывается только если эта координата есть на экране, то есть вы не можете сделать клик по области экрана, которая находится вне экрана. Также это не сработает, если курсор залочен (pointer lock api)
Удачи