From b877912d05741e4a7829cbdec57b378152591bd8 Mon Sep 17 00:00:00 2001 From: Matthias Guillitte Date: Sat, 7 Jun 2025 15:25:33 +0200 Subject: [PATCH] Fix add caption --- app/Browser/BrowserJob.php | 50 ++++++++++++++++++- .../InstagramRepost/InstagramRepostJob.php | 16 +----- 2 files changed, 50 insertions(+), 16 deletions(-) diff --git a/app/Browser/BrowserJob.php b/app/Browser/BrowserJob.php index 91fac36..6c036e0 100644 --- a/app/Browser/BrowserJob.php +++ b/app/Browser/BrowserJob.php @@ -287,8 +287,29 @@ abstract class BrowserJob implements ShouldQueue } } - public function typeText(Browser $browser, string $text, string $querySelector): void + /** + * Parse a string for use in JavaScript. + * + * @param string $string The string to parse. + * @return string The parsed string. + */ + private function parseJavaScriptString(string $string): string { + return str_replace("'", "\\'", $string); + } + + /** + * Type text into an input field using JavaScript. + * + * @param Browser $browser + * @param string $text The text to type. + * @param string $querySelector The CSS selector for the input field. + */ + public function setInputValue(Browser $browser, string $text, string $querySelector): void + { + $text = $this->parseJavaScriptString($text); + $querySelector = $this->parseJavaScriptString($querySelector); + $browser->script(" let element = document.querySelector('{$querySelector}'); if (element) { @@ -300,4 +321,31 @@ abstract class BrowserJob implements ShouldQueue } "); } + + /** + * Paste text into an element using JavaScript. + * Can be useful for non input elements that need to get text. For example works + * with `contenteditable` elements. + * + * @param Browser $browser + * @param string $text The text to paste. + * @param string $querySelector The CSS selector for the input field. + */ + public function pasteText(Browser $browser, string $text, string $querySelector): void + { + $text = $this->parseJavaScriptString($text); + $querySelector = $this->parseJavaScriptString($querySelector); + + $browser->script(" + var el = document.querySelector('{$querySelector}'), text = \"{$text}\"; + el.focus(); + const dataTransfer = new DataTransfer(); + dataTransfer.setData('text', text); + const event = new ClipboardEvent('paste', { + clipboardData: dataTransfer, + bubbles: true + }); + el.dispatchEvent(event) + "); + } } diff --git a/app/Browser/Jobs/InstagramRepost/InstagramRepostJob.php b/app/Browser/Jobs/InstagramRepost/InstagramRepostJob.php index 291d71b..8947781 100644 --- a/app/Browser/Jobs/InstagramRepost/InstagramRepostJob.php +++ b/app/Browser/Jobs/InstagramRepost/InstagramRepostJob.php @@ -332,21 +332,7 @@ class InstagramRepostJob extends BrowserJob implements ShouldBeUniqueUntilProces // Add a caption $captionText = $this->descriptionPipeline->process($videoInfo->getDescription()); - $captionText = str_replace('"', '\"', $captionText); - $browser->keys('div[contenteditable]', $captionText); // Type the caption in the contenteditable div - // $browser->script(" - // var el = document.querySelector('div[contenteditable]'), text = \"{$captionText}\"; - // const dataTransfer = new DataTransfer(); - // dataTransfer.setData('text', text); - // const event = new ClipboardEvent('paste', { - // clipboardData: dataTransfer, - // bubbles: true - // }); - // document.querySelector('div[contenteditable]').dispatchEvent(event) - // "); - //$this->typeText($browser, $captionText, 'div[contenteditable]'); - //$captionInput = $browser->driver->findElement(WebDriverBy::xpath('//div[@contenteditable]')); - //$captionInput->sendKeys($this->descriptionPipeline->process($videoInfo->getDescription())); + $this->pasteText($browser, $captionText, 'div[contenteditable]'); sleep(2); // Wait for the caption to be added