Скопировать изображение в буфер обмена браузера Chrome для MacOS, Windows, UbuntuJavascript

Форум по Javascript
Ответить
Anonymous
 Скопировать изображение в буфер обмена браузера Chrome для MacOS, Windows, Ubuntu

Сообщение Anonymous »

Я пытаюсь скопировать изображение в браузер (специально хром) буфер обмена для последующего вставки через Ctrl + V или CMD + V . Я попробовал 2 разных способа реализации этой функции, но не удался. И обратите внимание, что это структура автоматизации тестов, и это действие должно работать и в безголовом браузере.if image_path.lower().endswith(".svg"):
mime_type = "image/svg+xml"
elif image_path.lower().endswith(".png"):
mime_type = "image/png"
else:
CommonUtil.ExecLog(sModuleInfo, "Unsupported file format. You can copy only PNG or SVG image.", 2)
return "zeuz_failed"

with open(image_path, "rb") as image_file:
image_data = image_file.read()

# Convert
image_b64 = base64.b64encode(image_data).decode('utf-8')

async_script = """
const base64Data = arguments[0];
const mimeType = arguments[1];
const callback = arguments[arguments.length - 1];

function b64toBlob(b64Data, contentType) {
contentType = contentType || 'image/png';
const byteCharacters = atob(b64Data);
const byteArrays = [];

for (let offset = 0; offset < byteCharacters.length; offset += 512) {
const slice = byteCharacters.slice(offset, offset + 512);
const byteNumbers = new Array(slice.length);

for (let i = 0; i < slice.length; i++) {
byteNumbers = slice.charCodeAt(i);
}

const byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}

return new Blob(byteArrays, {type: contentType});
}

const blob = b64toBlob(base64Data, mimeType);
const item = new ClipboardItem({ [mimeType]: blob });

navigator.clipboard.write([item])
.then(() => callback(true))
.catch(async (err) => {
console.error('Standard clipboard failed:', err);
callback(false);
});
"""

success = selenium_driver.execute_async_script(async_script, image_b64, mime_type)
if success:
CommonUtil.ExecLog(sModuleInfo, f"The image ({mime_type}) successfully copied to clipboard.", 1)
return "passed"
else:
CommonUtil.ExecLog(sModuleInfo, "Failed to write image to clipboard", 3)
return "failed"
< /code>
Этот код работал для Ubuntu & Windows Chrome, но с просьбой о разрешении на буфер обмена. Поэтому я не смог обойти это разрешение, используя этот подход (если вы можете поделиться решением). Это структура тестирования автоматизации, поэтому мы не можем дать разрешение вручную. < /P>
Второй подход: < /h3>
Затем я попробовал другой подход, который я создам, я создам временный контейнер для этого изображения и помесчу изображение в Dom & Copy с помощью выбора, затем просто скопирую изображение. Итак, я написал этот код: < /p>
if image_path.lower().endswith(".svg"):
mime_type = "image/svg+xml"
elif image_path.lower().endswith(".png"):
mime_type = "image/png"
else:
CommonUtil.ExecLog(sModuleInfo, "Unsupported file format. You can copy only PNG or SVG image.", 2)
return "zeuz_failed"

with open(image_path, "rb") as image_file:
image_data = image_file.read()

# Convert
image_b64 = base64.b64encode(image_data).decode('utf-8')

js_script = f"""
try {{
const tempDiv = document.createElement('div');
tempDiv.style.position = 'absolute';
tempDiv.style.left = '-9999px';
tempDiv.style.top = '-9999px';
tempDiv.contentEditable = 'true';
document.body.appendChild(tempDiv);

const img = document.createElement('img');
img.src = 'data:{mime_type};base64,{image_b64}';
tempDiv.appendChild(img);

// Select and copy
const range = document.createRange();
range.selectNodeContents(tempDiv);
const selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
const success = document.execCommand('copy');
selection.removeAllRanges();

document.body.removeChild(tempDiv);

const event = new CustomEvent('copyImageResult', {{ detail: {{ success }} }});
document.dispatchEvent(event);
}} catch (error) {{
const event = new CustomEvent('copyImageResult', {{ detail: {{ error: error.message }} }});
document.dispatchEvent(event);
}}
"""

blob_script = f"""
return new Promise((resolve) => {{
const scriptBlob = new Blob([`{js_script}`], {{ type: 'application/javascript' }});
const scriptUrl = URL.createObjectURL(scriptBlob);
const script = document.createElement('script');

const nonce = document.querySelector('script[nonce]')?.nonce;
if (nonce) script.nonce = nonce;

script.src = scriptUrl;

document.addEventListener('copyImageResult', (e) => {{
URL.revokeObjectURL(scriptUrl);
script.remove();
resolve(e.detail);
}});

document.head.appendChild(script);
}});
"""

try:
result = selenium_driver.execute_script(blob_script)

if result.get('success'):
CommonUtil.ExecLog(sModuleInfo, f"Image copied to clipboard: {image_path}", 1)
return "passed"
else:
error_msg = result.get('error', 'Unknown error')
CommonUtil.ExecLog(sModuleInfo, f"Failed to copy image: {error_msg}", 3)
return "failed"
except Exception as e:
CommonUtil.ExecLog(sModuleInfo, f"JavaScript execution failed: {str(e)}", 3)
return "failed"
< /code>
Этот код, дающий ошибку в консоли браузера: < /p>
utils_js.js:2716 Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'self' 'wasm-unsafe-eval' 'inline-speculation-rules' http://localhost:* http://127.0.0.1:*". Either the 'unsafe-inline' keyword, a hash ('sha256-QgRF5QQhYvcb8AOx8AIBAHlvrqLG1SyG/Jlfg9eyGlI='), or a nonce ('nonce-...') is required to enable inline execution.


Подробнее здесь: https://stackoverflow.com/questions/796 ... ows-ubuntu
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»