Как и на каком языке можно написать программу, которая автоматизирует ручное заполнение информации в окне браузера

229
31 января 2018, 14:20

Текущий неавтоматизированный процесс выглядит следующим образом:

  1. Нужно зайти в браузер и открыть специальную ссылку;

  2. Нужно выбрать из выпадающего списка свой логин;

  3. Выбрать папку с файлами и сами файлы, которые будут загружаться;

  4. Дальше для каждого окошка появляются формы для заполнения, например: первый файл называется Автор - Книга.doc, под этим название есть две формы для заполнения: "Автор: "; "Книга";

  5. Руками копируется "Автор" в форму для заполнения; руками копируется "Книга" в форму для заполнения - так для каждого отдельного загружаемого файла;

  6. После того как все формы с "Авторами" и "Книгами" заполнены нажимается кнопка "Загрузить";

  7. По результатам загрузки появляется окно "Загрузка завершена": "Автор - Книга".... и эту информацию нужно скопировать, например, в эксель файл.

Вопрос: можно ли написать программу, которая автоматизирует этот процесс - чтобы она сама заполняла формы по стандартизированному название (между автором и книгой всегда могут стоять "пробел дефис пробел); чтобы копировала и заносила информацию в эксель; чтобы, перемещала загруженные файлы из одной папки в другую.

Из навыков программирования только VBA excel. Хочется также понять, что конкретно и в каких языках программирования стоит изучить, чтобы суметь сделать подобную программу. Предпочтительно на Python. И был бы очень признателен за ответы на то, как решить последовательные кусочки этой довольной большой задачи и где можно прочитать ответы, чтобы эти кусочки работали: как заполнять формы в браузере, используя имя файла "Автор - Книга.doc" над этими формами? Как выбирать логин из списка? и др.

Answer 1

Вместо того, чтобы пытаться повторить действия пользователя с GUI буквально, можно взглянуть на задачу глазами программиста:

  • вместо открытия браузера, заполнения и отправки формы, можно выполнить http POST запрос напрямую (request.post())
  • вместо выбора файлов в графическом диалоге, можно использовать API, которое возвращает список файлов по шаблону (Path().glob("*.doc"))
  • вместо копирования руками метаданных книги из названия файла Author - Title.doc в элементы формы, выставляются требуемые параметры запроса напрямую (http заголовки X-Book-Author, X-Book-Title в примере). Сами метаданные из имени файла можно получить манипулируя строку с именем напрямую: fn.split('-') или с помощью регулярных выражений: r'^([^-]+?)\s*-\s*(.+)\.doc$'
  • вместо копирования результатов загрузки из окна в Excel, ответ сервера напрямую печатается в csv формате в стандартный вывод (csv.writer(sys.stdout)) Что легко в файл скопировать (| tee -a books.csv)

Конечный скрипт, который загружает файлы с книгами, может выглядеть так:

#!/usr/bin/env python3
'''Upload "<author> - <title>.doc" books from the given directory.
Usage: upload-books <dir-path> | tee -a books.csv
'''
import csv
import re
import sys
from pathlib import Path
import requests # $ pip install requests
if len(sys.argv) < 2:
    sys.exit(__doc__)
src_dir = sys.argv[1]
book_files = []
for path in Path(src_dir).glob('*.doc'):
    metadata = re.findall(r'^([^-]+?)\s*-\s*(.+)\.doc$', path.name)
    if not metadata:
        print("warning: can't find author, title in path:", path, file=sys.stderr)
        continue # don't upload
    book_files[str(path)] = (path.name, path.open('rb'), 'application/msword', 
            dict(zip("X-Book-Author X-Book-Title".split(), metadata[0])))
r = requests.post('https://example.com/api/v1/books', files=book_files,
                  auth=('user', 'passwd'))
csv.writer(sys.stdout).writerows(r.json()['books']) # save uploaded books info

Это в хорошем случае, когда у сайта есть явное API или спонтанно сформировавшийся набор http запросов/ответов, не требует выполнения динамического кода в браузере (или когда результаты этого выполнения могут быть легко смоделированы).

В менее удачном случае, когда, например, за загрузку книг ответчает Silverlight control, который использует какой-нибудь свой протокол для общения с сервером, то может быть проще использовать инструменты GUI автоматизации такие как pywinauto, pyautogui или AutoIt (упомянутый в ответе на схожий вопрос на Stack Overflow).

В промежуточном случае, интерфейс реализован в браузере на javascript и работу с ним можно автоматизировать, используя что-нибудь вроде Selenium WebDriver (+ headless chrome).

Answer 2

Наиболее распространенным средством для таких целей является curl. Например, для формы с полями name, age и town команда должна вроде такой:

curl -d Name="HarryP" -d Age="123" -d Town="DefaultCity" -d Form_Submit="Send" http://www.example.com/process-form.php
READ ALSO
Вызвать функцию в Lua и получить возвращаемое значение в C++

Вызвать функцию в Lua и получить возвращаемое значение в C++

Как мне получить данные из Lua скрипта в С++ коде? Как понимаю обмен данными из скрипта в плюсы идет через особый LUA-СтекПомогите разобраться,...

226
проверка адресной строки в браузере

проверка адресной строки в браузере

я новичок в android, и у меня вопрос: можно ли получать (при помощи service) адрес на который пользователь переходит в браузере?

178
Почему тэг th:text не срабатывает

Почему тэг th:text не срабатывает

У меня есть следующий код adminjsp:

210