Взаимодействовать с браузером JavaScript через командную строку или локальный скрипт? - PullRequest
5 голосов
/ 04 ноября 2019

Мы предлагаем JavaScript на странице браузера, похожий на imagemagick, который помогает людям конвертировать изображения в разные размеры и форматы. Однако для этого требуется взаимодействие с веб-страницей.

Можно ли позволить людям автоматизировать это взаимодействие - без отправки изображений на наш сервер (что увеличивает стоимость полосы пропускания и нагрузку на сервер) и , не требуя от пользователейскачать библиотеку безголового браузера, например, Puppeteer?

Например, возможен ли следующий поток:

  1. Открыть Chrome через командную строку (или локальный скрипт) на определенной веб-странице.
  2. Загрузка изображения на эту веб-страницу.
  3. Вызов сценария на веб-странице.
  4. Получение результатов сценария и возможность локальной манипуляции.

Запуск Chrome возможен, но неясно, сможете ли вы взаимодействовать с конкретным окном браузера после его запуска.

Ответы [ 4 ]

4 голосов
/ 07 ноября 2019

Должен быть технически автоматизирован, но это далеко не так просто.

Ваш вопрос можно разделить на две части: автономная обработка и автоматизация загрузки.


Автономная обработка

Предполагая, что ваш код обработки изображений полностью в JavaScript-коде браузера (вместо, скажем, модульной программы-узла, вызывающей собственные библиотеки), можно выполнять всю обработку в браузере.

Файл "загружен" может быть прочитан , обработан и загружен без отправки чего-либо на сервер. Обработка может даже происходить в фоновом потоке , поддерживающем отзывчивость пользовательского интерфейса, например, хорошую индикатор выполнения.

Сам код может быть размещен в Интернете с помощью Service Worker или статический html + javascript. Оба могут быть открыты и выполнены в автономном режиме, после посещения или развертывания. (Обратите внимание, что Chrome строго ограничивает статический html, в том числе жесткие ограничения для веб-работников. Google предпочитает держать вещи в сети.)


Автоматизация загрузки

AsКак уже упоминалось выше, файл, выбранный путем ввода файла или помещенный в браузер, может быть прочитан с помощью JavaScript на странице, но я по-прежнему буду называть его действием «загрузки» в традиции.

Chrome имеет некоторые расширения автоматизации,прежде всего Kantu , но они не могут обрабатывать загрузку файлов из-за ограничения безопасности в Chrome .

Так что, если вы хотите автоматизировать выбор файла, вам нужно использоватьвстроенный инструмент автоматизации вне браузера, такой как Kantu XModules , AutoHotkey или SikuliX . Коммерческое решение существует, но с аналогичными ограничениями, учитывая ваши необычные требования, связанные с отсутствием автономного браузера.

  • AutoHotkey будет сфокусирован на симуляции клавиатуры (откройте браузер, подождите 5 секунд, нажмите вкладку 10 раз, нажмитевведите, подождите 2 секунды, введите имя файла, нажмите клавишу ввода и т. д.) и можно скомпилировать в развертываемый exe-файл.

  • Sikulix более мощный, но его также сложнеераспространять;только среда выполнения Java больше, чем браузер.

  • Kantu + XModules - это нечто среднее между ними. Пользователям нужно будет установить расширение для браузера, и его родное расширение, но после того, как все сделано, все происходит в браузере (более или менее).

Все три методавключает в себя симуляцию ввода имени файла, потому что, насколько я знаю, не существует более простого способа его автоматизации в запущенном пользователем (без заголовка) Chrome.

Имя файла изображения может быть передано в качестве параметрав командную строку для AutoHotkey и Sikulix, или сохраняются в файле и читаются сценарием в случае Канту.

Во всех трех случаях автоматизация моделирует пользователя, и реальный пользователь не должен касатьсякомпьютер во время выполнения сценария, или автоматизация сломается.


Как насчет командной строки?

В качестве альтернативы, если ваша цель - автоматизация без развертываниябраузер, вы можете рассмотреть возможность создания программы для командной строки node.js и упаковать ее как exe.

Дистрибутив будет тяжелее, чем скомпилированный AutoHotkey, но естьНамного меньше движущихся частей, и, следовательно, гораздо более надежно:

  • Независимо от версии Chrome или наличия модулей XModules.
  • Вся обработка происходит в своем собственном процессе, вместо того, чтобы угнать пользователяChrome.
  • Может выполняться без заголовка, что очень важно для автоматизации.
  • Гибкие параметры командной строки.

Но мне нравится автоматизация браузера, так просто

Подумайте еще раз.

По моему опыту, многие вещи отключат автоматизацию браузера / графического интерфейса:

  1. Необычное разрешение экрана, масштабирование браузера, масштабирование ОС или последний запоминаемый размер Chrome, который искажает вашу страницу до неузнаваемости.
  2. Расширения браузера, которые изменяют элементы страницы, такие как блокировщики рекламы.
  3. IME и другие программы, которые перехватывают ввод с клавиатуры с помощью горячих клавиш.
  4. Всплывающие программы, такие как антивирус, обновление Windows или вставка компакт-диска.
  5. Случайные блокировки, спящие режимы, выходы из системы,клавиши, оставленные на клавиатуре, или прерывание питания.
  6. Или простое обновление Chrome, которое ломает любую из 100 вещей, от которых вы зависите.

Итак, вот ваши причины, почему компьютеравтоматизацию лучше выполнять без головы.


Мой код будет безопасным?

Если вы беспокоитесь о безопасности своего скрипта, не беспокойтесь. В тот момент, когда вы хотите, чтобы обработка происходила на стороне клиента, кот исчезает.

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

2 голосов
/ 07 ноября 2019

Один из способов построить ваше веб-приложение:

1) перенаправить console.log на стандартный выход (см. Здесь: Как в Chrome получить вывод консоли javascript в stdout /stderr ), возможно, с соответствующим флагом --log-level и сообщениями об ошибках, перенаправленными куда-то еще, поэтому некоторые случайные сообщения не нарушают целиком,

2) от уровня сценария, вместо / помимо сохраненияфайл результатов, console.log, его в Base64,

3) и со стороны интерфейса командной строки используйте канал (каналы), который делает Base64 подходящим файлом (и любой дополнительной обработкой).

0 голосов
/ 13 ноября 2019

Все это возможно с PowerShell. Используя Powershell, вы можете открыть браузер (IE будет намного проще с Powershell, поскольку он поддерживается естественным образом). Вы можете открыть веб-страницу, заполнить форму, загрузить или загрузить данные, получить объект, проверить и т. Д.

Посетите ниже Веб-страница для получения более подробной информации:

Надеюсь, что этопомогает.

0 голосов
/ 13 ноября 2019

Selenium WebDriver должно быть достаточно, используйте ChromeDriver для автоматизации задач в Chrome.

Чтобы загрузить файл, выберите элемент и используйте sendKeys, подробнее здесь :

driver.findElement(By.id("myUploadElement"))
.sendKeys("<absolutePathToMyFile>");
...