1 (изменено: Ander, 2021-11-21 17:29:04)

Тема: Автоматизация действий в браузере на сервере

Здравствуйте форумчане!
Неделю бьюсь с проблемой автоматизации входа на сайт и скачивания файла. Сразу была написана программа на VBS - все работает, пока сидишь в терминальном сеансе. Стоит пустить все на самотек, отключаешься от сеанса, либо запускаешь скрипт входа локального пользователя BAT-файл

tscon 1 /dest:console
rundll32.exe user32.dll, LockWorkStation

. Как все - не работает правильно. Алгоритм программы следующий: запускается браузер в режиме инкогнито, заходит на сайт, вводит логин и пароль, переходит по ссылке скачки файла, закрывает браузер. При отключении терминального сеанса не передаются в браузер нажатия клавиш (ввод логина, пароля, закрытие ALT+F4). Сервер работает на Windows 2008 R2.
Попытка №2 было использование AutoHotkey. Написана программа, которая делает тоже самое. Сконвертировал в EXE-файл. Пока подключен - все работает. Запускаю автоматом (со скрипта, с планировщика, просто ставлю паузу в программе отключаюсь от сеанса) не эмулируется нажатие клавиш. Браузер запускается и на этом все.
Подскажите пожалуйста как решить эту задачу.

2

Re: Автоматизация действий в браузере на сервере

Посмотрите https://qna.habr.com/q/893367.
Поможет - расскажите.

3

Re: Автоматизация действий в браузере на сервере

Делать, чтоб постоянно работал GUI - это как-то неправильно выглядит, похоже на костыли (это последний вариант). Может есть какие-то методы управления браузером не эмуляцией ввода пользователем, а например через API или еще как-то програмно?

4

Re: Автоматизация действий в браузере на сервере

Ander
Selenium WebDriver
Chrome.ahk

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: Автоматизация действий в браузере на сервере

Ander пишет:

Сразу была написана программа на VBS

Содержимое которой мы должны угадать?

6

Re: Автоматизация действий в браузере на сервере

Толку ее постить, если в ней просто эмуляция нажатия нужных клавиш через SendKeys и это не работает, когда отключен GUI. Ищется другой метод рализации.

7 (изменено: Ander, 2021-11-27 22:01:25)

Re: Автоматизация действий в браузере на сервере

Начал изучать chrome.ahk
Написал простенькую прогу, входа на сайт

#Include Chrome.ahk
ChromeInst := new Chrome(,, "--incognito") ; ,, "--headless") ;Запускаем окно браузера в режиме инкогнито
PageInst := ChromeInst.GetPage()
PageInst.Call("Page.navigate", {"url": "https://site.com/login"})
PageInst.WaitForLoad()
PageInst.Call("Runtime.evaluate" , { expression: "document.querySelector('#user_email.form-input').value = 'LOGIN';"})
PageInst.Call("Runtime.evaluate" , { expression: "document.querySelector('#user_password.form-input').value = 'PASSWORD';"})
;PageInst.Call("Runtime.evaluate" , { expression: "document.querySelector('#button.btn').submit();"}) ; не нажимает кнопку
;PageInst.Call("Input.dispatchKeyEvent" , { type: "keyDown" , key: "Enter"}, 0) ; не нажимает кнопку
PageInst.Call("Runtime.evaluate" , { expression: "document.querySelector('#button.btn').click();"}) ; не нажимает кнопку
PageInst.WaitForLoad()


; Execute some JavaScript
PageInst.Evaluate("alert('Waiting');")

PageInst.Call("Browser.close")
PageInst.Disconnect()

ExitApp
return

Перебрал три варианта нажатия на кнопку - ни один не работает. Подскажите пожалуйста как нажать кнопку входа.

8

Re: Автоматизация действий в браузере на сервере

Для начала, тестируйте джаваскрипт не в AHK-скрипте, а непосредственно в консоли инструментов разработчика браузера.
В Chrome.ahk есть метод PageInst.Evaluate("your script is here").

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: Автоматизация действий в браузере на сервере

Если пытаетесь кликнуть кнопку «Вхiд», то указан неверный селектор.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: Автоматизация действий в браузере на сервере

user_email.form-input и user_password.form-input отрабатывают хорошо, button.btn - брал там же. Подскажите пожалуйста какой тогда селектор? submit - пробовал, не работает.

11

Re: Автоматизация действий в браузере на сервере

А чего гадать-то? Открываете инструменты разработчика, вкладка «Элементы», находите кнопку, видите:
 
 https://i.imgur.com/wWo9Kto.png
 
Откуда у вас взялось #button.btn? Знак # означает селектор id, здесь его нет. Селектор тега записывается без всяких префиксов, просто button. Селектор класса правильно записан через точку. Можно ещё дописать атрибут:

document.querySelector('button.btn[type="submit"]')
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: Автоматизация действий в браузере на сервере

Спасибо за подсказку, сработало так

PageInst.Call("Runtime.evaluate" , { expression: "document.querySelector('button.btn').click();"})

Объясните пожалуйста, почему это выражение не работает:

PageInst.Call("Input.dispatchKeyEvent" , { type: "keyDown" , key: "Enter"}, 0)

После ввода логина и пароля, если нажать Enter - должно заходить на сайт.

13

Re: Автоматизация действий в браузере на сервере

Не знаю, просто эмуляция клавиш не всегда срабатывает.
Вместо PageInst.Call("Runtime.evaluate", ...) проще использовать вышеуказанный PageInst.Evaluate(js).

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

14

Re: Автоматизация действий в браузере на сервере

Ander пишет:

Объясните пожалуйста, почему это выражение не работает:

Возможно баг. Посылайте так:

PageInst.Call("Input.dispatchKeyEvent" , { type: "char", text: "`r" }, 0)

15

Re: Автоматизация действий в браузере на сервере

Все заработало, как хотел. Всем большущее спасибо за помощь.
Теперь прога крутится на серваке и по заданию из планировщика качает файл остатков на складе!