@@ -3,6 +3,7 @@ package dynamic
3
3
import (
4
4
"context"
5
5
"fmt"
6
+ "github.com/mafredri/cdp/protocol/dom"
6
7
"hash/fnv"
7
8
"sync"
8
9
"time"
@@ -531,6 +532,45 @@ func (doc *HTMLDocument) SelectBySelector(selector values.String, value *values.
531
532
return nil , core .TypeError (core .ArrayType , res .Type ())
532
533
}
533
534
535
+ func (doc * HTMLDocument ) HoverBySelector (selector values.String ) error {
536
+ ctx , cancel := contextWithTimeout ()
537
+ defer cancel ()
538
+
539
+ err := doc .ScrollBySelector (selector )
540
+
541
+ if err != nil {
542
+ return err
543
+ }
544
+
545
+ selectorArgs := dom .NewQuerySelectorArgs (doc .element .id .nodeID , selector .String ())
546
+ found , err := doc .client .DOM .QuerySelector (ctx , selectorArgs )
547
+
548
+ if err != nil {
549
+ doc .element .logError (err ).
550
+ Str ("selector" , selector .String ()).
551
+ Msg ("failed to retrieve a node by selector" )
552
+
553
+ return err
554
+ }
555
+
556
+ if found .NodeID <= 0 {
557
+ return errors .New ("element not found" )
558
+ }
559
+
560
+ q , err := getClickablePoint (ctx , doc .client , & HTMLElementIdentity {
561
+ nodeID : found .NodeID ,
562
+ })
563
+
564
+ if err != nil {
565
+ return err
566
+ }
567
+
568
+ return doc .client .Input .DispatchMouseEvent (
569
+ ctx ,
570
+ input .NewDispatchMouseEventArgs ("mouseMoved" , q .X , q .Y ),
571
+ )
572
+ }
573
+
534
574
func (doc * HTMLDocument ) WaitForSelector (selector values.String , timeout values.Int ) error {
535
575
task := events .NewEvalWaitTask (
536
576
doc .client ,
@@ -815,7 +855,7 @@ func (doc *HTMLDocument) ScrollTop() error {
815
855
window.scrollTo({
816
856
left: 0,
817
857
top: 0,
818
- behavior: 'smooth '
858
+ behavior: 'instant '
819
859
});
820
860
` , false , false )
821
861
@@ -827,13 +867,32 @@ func (doc *HTMLDocument) ScrollBottom() error {
827
867
window.scrollTo({
828
868
left: 0,
829
869
top: window.document.body.scrollHeight,
830
- behavior: 'smooth '
870
+ behavior: 'instant '
831
871
});
832
872
` , false , false )
833
873
834
874
return err
835
875
}
836
876
877
+ func (doc * HTMLDocument ) ScrollBySelector (selector values.String ) error {
878
+ _ , err := eval .Eval (doc .client , fmt .Sprintf (`
879
+ var el = document.querySelector(%s);
880
+
881
+ if (el == null) {
882
+ throw new Error("element not found");
883
+ }
884
+
885
+ el.scrollIntoView({
886
+ behavior: 'instant'
887
+ });
888
+
889
+ return true;
890
+ ` , eval .ParamString (selector .String ()),
891
+ ), false , false )
892
+
893
+ return err
894
+ }
895
+
837
896
func (doc * HTMLDocument ) handlePageLoad (_ interface {}) {
838
897
doc .Lock ()
839
898
defer doc .Unlock ()
0 commit comments