Автоматизация форм с помощью Selenium или React Native

Отбывая срочную службу, я заметил, что приходится заполнять довольно много цифровых форм. И это не разовые формы, это формы, которые мне приходится заполнять каждый день. Будучи сам решателем проблем (к тому же ленивым), я хотел сделать эти формы намного проще в заполнении. Я хотел

  1. хранить данные более простым способом
  2. обрабатывать их в данные, ожидаемые формой
  3. автоматически заполнять форму.

После некоторых экспериментов я нашел несколько решений

Selenium

В июне 2022 года я выполнил несколько заданий CTF (HTB CTF, SEETF), некоторые из которых включали использование этой библиотеки Python под названием selenium в качестве веб-бота. Мне уже приходилось читать код с использованием этой библиотеки, и я решил, что могу использовать ее для автоматизации отправки своих форм.

На самом деле запустить ее довольно просто. Во-первых, вам нужно установить ее и необходимые зависимости. Вам следует pip install selenium, но вам также нужно установить драйвер веб-браузера. Я использовал ChromeDriver, но есть также GeckoDriver для Firefox.

Вот пример кода. Он заполняет текстовое поле, которое вы можете выбрать по ID элемента, и нажимает на элемент. Используя эти концепции, вы, вероятно, сможете сделать сценарий для автозаполнения собственной формы

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

def visit_report():
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument("--incognito")
    client = webdriver.Chrome(chrome_options=chrome_options,
        executable_path=r"/run/media/hacker/Windows/Users/zunmu/Documents/Stuff/Linux Tools/chromedriver")
        #executable_path=r"D:\chromedriver.exe")
    client.set_page_load_timeout(10)
    client.set_script_timeout(10)

    client.get('https://www.w3schools.com/html/html_forms.asp')
    time.sleep(3)
    ### Fill up text fields
    client.find_element_by_id("fname").send_keys("Data")
    client.find_element_by_id("lname").click()
    ### Traversing the DOM
    button = (
        client.find_element_by_id("fname")
        .find_element(by=By.XPATH,value='..')
        .find_elements_by_xpath(".//*")[-1]
    )
    button.click()
    time.sleep(300)
    client.quit()

visit_report()
Вход в полноэкранный режим Выход из полноэкранного режима

Selenium Python имеет несколько полезных ресурсов, таких как

  1. https://selenium-python.readthedocs.io/locating-elements.html
  2. https://stackoverflow.com/questions/24795198/get-all-child-elements

Одним из преимуществ является то, что вы можете использовать любые библиотеки, какие захотите, и что это легко кодировать. В итоге я объединил Selenium и openpyxl, библиотеку Excel Sheet Python, для чтения данных из Excel Sheet и автозаполнения формы.

Мобильный Selenium?

Топовая версия — это здорово и все такое, но я хотел что-то мобильное. В конце концов, я не везде беру с собой ноутбук. Мой первый подход заключался в том, чтобы просто запустить код selenium на мобильном устройстве.

Я уже установил Kali NetHunter на свой телефон Android и подумал, сможет ли он запустить мой Python-скрипт как есть. Оказалось, что Chrome не поддерживается в моей установке Kali NetHunter из-за неправильной конфигурации SUID.

Я поменял драйвер на GeckoDriver, чтобы воспользоваться преимуществами Firefox, предустановленного на nethunter. Я нашел двоичный файл ARM здесь, скачал его и обновил свой скрипт с новым WebDriver, как здесь.

В итоге все работает довольно хорошо, не нужно все перекодировать, но

  1. Вам нужно пройти через NetHunter, интерфейс которого не очень интуитивно понятен.
  2. Он работает только на Android, но не на iOS.

Я хотел найти лучшее решение, чтобы поделиться радостью автозаполнения форм с другими.

React-Native / Expo

По прихоти я решил поискать React Native WebView и проверить, есть ли в нем функциональность для автозаполнения форм. Я получил кое-что еще лучше, мы можем внедрить наш собственный пользовательский код Javascript с помощью свойства injectedJavaScript. Ссылка здесь.

<WebView 
      style={styles.container}
      source={{uri: 'https://github.com/react-native-community/react-native-webview'}}  
      javaScriptEnabled={true}
      injectedJavaScript={`document.body.style.backgroundColor = 'red';
      setTimeout(function() { window.alert('hi') }, 2000);
      true;`}    
      onMessage={(event) => {}}
    />
Вход в полноэкранный режим Выход из полноэкранного режима

%[http://snack.expo.dev/@hackin7/basic-webview-usage].

Вы должны обратить внимание, что код, который вы хотите запустить для автозаполнения документа, вероятно, должен быть в setTimeout для запуска через несколько секунд после загрузки документа (вероятно, чтобы дать ему время загрузиться).

С этим я провел выходные, работая над созданием Proof of Concept App для автоматического заполнения форм. Я использовал document.getElementById("<id>").value = <value>; и <element>.click(); в Javascript. Сделать приложение так же сложно, как и обычное мобильное приложение (сложнее, чем selenium, но ничего слишком сложного или трудного).

И это мой путь к созданию приложения для автоматического заполнения нужной мне формы.

В целом

В целом, Selenium хорош для быстрого создания прототипов, в то время как вы можете использовать React Native/ Expo для окончательной доработки приложения.

Вероятно, существует множество других способов сделать это. Например, WebView в Android SDK, вероятно, имеет функциональность для взаимодействия с элементами, как показано здесь. В качестве альтернативы можно просто вручную написать сценарий на Python, который может генерировать Javascript для вставки в консоль разработчика (хотя это не самое элегантное решение).

Оцените статью
devanswers.ru
Добавить комментарий