Вставка текста в поле - мгновенно, решение на C#

kagorec

Client
Регистрация
24.08.2013
Сообщения
1 144
Реакции
662
Баллы
113
Вставка текста/кода мгновенно в поле формы (на сайте)

Стандартные методы автозаполнения часто вводят текст посимвольно с задержкой.
Этот способ мгновенно вставляет в поле содержимое из переменной .

Особенность:
Скрипт использует собственный внутренний буфер (в instance zennoposter), не затрагивая системный буфер обмена Windows
Это позволяет запускать шаблон Zennoposter многопоточно, без опасения что данные смогут пересекаться.

Как это работает:
1. Помещаете нужный текст (любого объёма) в переменную.
2. Кликаете например по полю textarea или input на сайте (в коде `Шаг 2` можно указать свой xpath формы для клика)
3. Содержимое переменной вставляется сразу целиком.
4. Поддерживается переход строки (если текст большой то ничего не слипается в одну сплошную строку)

Используйте для кубика C#

C#:
Развернуть Свернуть Копировать
string sendi = project.Variables["input"].Value;

string escaped = sendi
    .Replace("\\", "\\\\")
    .Replace("'", "\\'")
    .Replace("\r\n", "\\n")
    .Replace("\n", "\\n")
    .Replace("\r", "\\n");

// Шаг 1: Кладём текст в псевдобуфер браузера и вешаем перехватчик paste
string jsSetup = $@"
    window._zpPasteText = '{escaped}';

    if (!window._zpPasteHooked) {{
        window._zpPasteHooked = true;
        document.addEventListener('paste', function(e) {{
            if (!window._zpPasteText) return;
            e.preventDefault();
            e.stopImmediatePropagation();
            var text = window._zpPasteText;
            var el = document.activeElement;
            if (!el) return;
            // Попытка через execCommand
            var ok = document.execCommand('insertText', false, text);
            if (!ok) {{
                var s = el.selectionStart != null ? el.selectionStart : el.value.length;
                var en = el.selectionEnd  != null ? el.selectionEnd  : el.value.length;
                el.value = el.value.substring(0, s) + text + el.value.substring(en);
                el.selectionStart = el.selectionEnd = s + text.length;
                el.dispatchEvent(new Event('input',  {{ bubbles: true }}));
                el.dispatchEvent(new Event('change', {{ bubbles: true }}));
            }}
            window._zpPasteText = '';
        }}, true);
    }}
";
instance.ActiveTab.MainDocument.EvaluateScript(jsSetup);

// Шаг 2: Фокусируемся на элементе (если нужно — найти по XPath и кликнуть).
// Этот `Шаг 2` можете закомментировать, если используете свой кубик (focus или click) перед этим кубиком.
instance.ActiveTab.MainDocument.FindElementByXPath("//textarea[@rows='1' and contains(@class,'message-input-textarea')]", 0).Click();

// Шаг 3: Имитируем Ctrl+V через KeyEvent — браузер перехватит paste-handler выше
string jsFirePaste = @"
    (function() {
        var el = document.activeElement;
        if (!el) return 'no_focus';
        el.focus();
        var e = new KeyboardEvent('keydown', {
            key: 'v', code: 'KeyV',
            ctrlKey: true, bubbles: true, cancelable: true
        });
        el.dispatchEvent(e);

        // Дополнительно диспатчим paste напрямую
        var dt = new DataTransfer();
        dt.setData('text/plain', window._zpPasteText || '');
        var pe = new ClipboardEvent('paste', {
            bubbles: true, cancelable: true, clipboardData: dt
        });
        el.dispatchEvent(pe);
        return 'fired';
    })();
";

string result = instance.ActiveTab.MainDocument.EvaluateScript(jsFirePaste);
project.SendInfoToLog($"Вставка: {result}", false);

п.с. Получаем буфер обмена в броузере (внутри instance) - Ранее предложен мною был безопасный вариант получения буфер обмена
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)