11package com .codeborne .selenide ;
22
3+ import org .openqa .selenium .chromium .ChromiumDriver ;
4+ import org .openqa .selenium .devtools .DevTools ;
5+ import org .openqa .selenium .devtools .HasDevTools ;
6+ import org .openqa .selenium .devtools .v127 .browser .Browser ;
7+
38import javax .annotation .CheckReturnValue ;
49import javax .annotation .Nonnull ;
510import javax .annotation .ParametersAreNonnullByDefault ;
813import java .awt .datatransfer .StringSelection ;
914import java .awt .datatransfer .UnsupportedFlavorException ;
1015import java .io .IOException ;
16+ import java .util .List ;
17+ import java .util .Optional ;
18+
19+ import static com .codeborne .selenide .impl .WebdriverUnwrapper .cast ;
20+ import static com .codeborne .selenide .impl .WebdriverUnwrapper .instanceOf ;
21+ import static java .util .Optional .empty ;
22+ import static org .openqa .selenium .devtools .v127 .browser .model .PermissionType .CLIPBOARDREADWRITE ;
23+ import static org .openqa .selenium .devtools .v127 .browser .model .PermissionType .CLIPBOARDSANITIZEDWRITE ;
1124
1225@ ParametersAreNonnullByDefault
1326public class DefaultClipboard implements Clipboard {
@@ -31,12 +44,25 @@ public Clipboard object() {
3144 return this ;
3245 }
3346
47+ private boolean grantPermission () {
48+ Optional <HasDevTools > cdpBrowser = cast (driver , HasDevTools .class );
49+ if (cdpBrowser .isPresent () && instanceOf (driver , ChromiumDriver .class )) {
50+ DevTools devTools = cdpBrowser .get ().getDevTools ();
51+ devTools .send (Browser .grantPermissions (List .of (CLIPBOARDREADWRITE , CLIPBOARDSANITIZEDWRITE ), empty (), empty ()));
52+ return true ;
53+ }
54+ return false ;
55+ }
56+
3457 @ CheckReturnValue
3558 @ Nonnull
3659 @ Override
3760 public String getText () {
38- assertRemoteState ();
61+ if (grantPermission ()) {
62+ return driver .executeJavaScript ("return await navigator.clipboard.readText()" );
63+ }
3964 try {
65+ assertLocalBrowser ();
4066 return Toolkit .getDefaultToolkit ().getSystemClipboard ().getData (DataFlavor .stringFlavor ).toString ();
4167 }
4268 catch (UnsupportedFlavorException | IOException e ) {
@@ -46,11 +72,16 @@ public String getText() {
4672
4773 @ Override
4874 public void setText (String text ) {
49- assertRemoteState ();
50- Toolkit .getDefaultToolkit ().getSystemClipboard ().setContents (new StringSelection (text ), new StringSelection (text ));
75+ if (grantPermission ()) {
76+ driver .executeJavaScript ("await navigator.clipboard.writeText(arguments[0])" , text );
77+ }
78+ else {
79+ assertLocalBrowser ();
80+ Toolkit .getDefaultToolkit ().getSystemClipboard ().setContents (new StringSelection (text ), new StringSelection (text ));
81+ }
5182 }
5283
53- private void assertRemoteState () {
84+ private void assertLocalBrowser () {
5485 if (driver .config ().remote () != null )
5586 throw new IllegalStateException ("Remote driver url detected! Please use remote clipboard." );
5687 }
0 commit comments