877
877
< ul class ="md-nav__list ">
878
878
879
879
< li class ="md-nav__item ">
880
- < a href ="#cdp-mode-initialization " class ="md-nav__link ">
880
+ < a href ="#cdp-mode-usage " class ="md-nav__link ">
881
881
< span class ="md-ellipsis ">
882
- 🐙 CDP Mode initialization
882
+ 🐙 CDP Mode usage
883
+ </ span >
884
+ </ a >
885
+
886
+ </ li >
887
+
888
+ < li class ="md-nav__item ">
889
+ < a href ="#here-are-some-common-sbcdp-methods " class ="md-nav__link ">
890
+ < span class ="md-ellipsis ">
891
+ 🐙 Here are some common sb.cdp methods
883
892
</ span >
884
893
</ a >
885
894
2647
2656
< ul class ="md-nav__list ">
2648
2657
2649
2658
< li class ="md-nav__item ">
2650
- < a href ="#cdp-mode-initialization " class ="md-nav__link ">
2659
+ < a href ="#cdp-mode-usage " class ="md-nav__link ">
2660
+ < span class ="md-ellipsis ">
2661
+ 🐙 CDP Mode usage
2662
+ </ span >
2663
+ </ a >
2664
+
2665
+ </ li >
2666
+
2667
+ < li class ="md-nav__item ">
2668
+ < a href ="#here-are-some-common-sbcdp-methods " class ="md-nav__link ">
2651
2669
< span class ="md-ellipsis ">
2652
- 🐙 CDP Mode initialization
2670
+ 🐙 Here are some common sb.cdp methods
2653
2671
</ span >
2654
2672
</ a >
2655
2673
@@ -2736,7 +2754,7 @@ <h1>🐙 CDP Mode</h1>
2736
2754
< h2 id ="cdp-mode "> < a href ="https://github.com/seleniumbase/SeleniumBase/ "> < img src ="https://seleniumbase.github.io/img/logo6.png " title ="SeleniumBase " width ="32 "> </ a > CDP Mode 🐙< a class ="headerlink " href ="#cdp-mode " title ="Permanent link "> ¶</ a > </ h2 >
2737
2755
< p > 🐙 < b translate ="no "> SeleniumBase</ b > < b translate ="no "> CDP Mode</ b > (Chrome Devtools Protocol Mode) is a special mode inside of < b > < a href ="../../help_docs/uc_mode.md " translate ="no "> < span translate ="no "> SeleniumBase UC Mode</ span > </ a > </ b > that lets bots appear human while controlling the browser with the < b translate ="no "> CDP-Driver</ b > . Although regular < span translate ="no "> UC Mode</ span > can't perform < span translate ="no "> WebDriver</ span > actions while the < code > driver</ code > is disconnected from the browser, the < span translate ="no "> CDP-Driver</ span > can still perform actions (while maintaining its cover).</ p >
2738
2756
< p > 👤 < b translate ="no "> UC Mode</ b > avoids bot-detection by first disconnecting WebDriver from the browser at strategic times, calling special < code > PyAutoGUI</ code > methods to bypass CAPTCHAs (as needed), and finally reconnecting the < code > driver</ code > afterwards so that WebDriver actions can be performed again. Although this approach works for bypassing simple CAPTCHAs, more flexibility is needed for bypassing bot-detection on websites with advanced protection. (That's where < b translate ="no "> CDP Mode</ b > comes in.)</ p >
2739
- < p > 🐙 < b translate ="no "> CDP Mode</ b > is based on < a href ="https://github.com/HyperionGray/python-chrome-devtools-protocol " translate ="no "> python-cdp</ a > , < a href ="https://github.com/HyperionGray/trio-chrome-devtools-protocol " translate ="no "> trio-cdp</ a > , and < a href ="https://github.com/ultrafunkamsterdam/nodriver " translate ="no "> nodriver</ a > . < code > trio-cdp</ code > was an early implementation of < code > python-cdp</ code > , whereas < code > nodriver</ code > is a modern implementation of < code > python-cdp</ code > . (Refactored CDP code is imported from < a href ="https://github.com/mdmintz/MyCDP " translate ="no "> MyCDP</ a > .)</ p >
2757
+ < p > 🐙 < b translate ="no "> CDP Mode</ b > is based on < a href ="https://github.com/HyperionGray/python-chrome-devtools-protocol " translate ="no "> python-cdp</ a > , < a href ="https://github.com/HyperionGray/trio-chrome-devtools-protocol " translate ="no "> trio-cdp</ a > , and < a href ="https://github.com/ultrafunkamsterdam/nodriver " translate ="no "> nodriver</ a > . < code > trio-cdp</ code > is an early implementation of < code > python-cdp</ code > , and < code > nodriver</ code > is a modern implementation of < code > python-cdp</ code > . (Refactored Python- CDP code is imported from < a href ="https://github.com/mdmintz/MyCDP " translate ="no "> MyCDP</ a > .)</ p >
2740
2758
< p > 🐙 < b translate ="no "> CDP Mode</ b > includes multiple updates to the above, such as:</ p >
2741
2759
< ul >
2742
2760
< li > Sync methods. (Using < code > async</ code > /< code > await</ code > is not necessary!)</ li >
@@ -2747,13 +2765,38 @@ <h2 id="cdp-mode"><a href="https://github.com/seleniumbase/SeleniumBase/"><img s
2747
2765
< li > Faster response time for support. (Eg. < a href ="https://discord.gg/EdhQTn3EyE "> Discord Chat</ a > )</ li >
2748
2766
</ ul >
2749
2767
< hr />
2750
- < h3 id ="cdp-mode-initialization "> 🐙 < b translate ="no "> CDP Mode</ b > initialization < a class ="headerlink " href ="#cdp-mode-initialization " title ="Permanent link "> ¶</ a > </ h3 >
2768
+ < h3 id ="cdp-mode-usage "> 🐙 < b translate ="no "> CDP Mode</ b > usage < a class ="headerlink " href ="#cdp-mode-usage " title ="Permanent link "> ¶</ a > </ h3 >
2751
2769
< ul >
2752
- < li > < code > sb.activate_cdp_mode(url)</ code > </ li >
2770
+ < li > < strong > < code > sb.activate_cdp_mode(url)</ code > </ strong > </ li >
2753
2771
</ ul >
2754
2772
< blockquote >
2755
2773
< p > (Call that from a < strong > UC Mode</ strong > script)</ p >
2756
2774
</ blockquote >
2775
+ < p > That disconnects WebDriver from Chrome (which prevents detection), and gives you access to < code > sb.cdp</ code > methods (which don't trigger anti-bot checks).</ p >
2776
+ < h3 id ="here-are-some-common-sbcdp-methods "> 🐙 Here are some common < code > sb.cdp</ code > methods< a class ="headerlink " href ="#here-are-some-common-sbcdp-methods " title ="Permanent link "> ¶</ a > </ h3 >
2777
+ < ul >
2778
+ < li > < code > sb.cdp.click(selector)</ code > </ li >
2779
+ < li > < code > sb.cdp.click_if_visible(selector)</ code > </ li >
2780
+ < li > < code > sb.cdp.type(selector, text)</ code > </ li >
2781
+ < li > < code > sb.cdp.press_keys(selector, text)</ code > </ li >
2782
+ < li > < code > sb.cdp.select_all(selector)</ code > </ li >
2783
+ < li > < code > sb.cdp.get_text(selector)</ code > </ li >
2784
+ </ ul >
2785
+ < p > When < code > type()</ code > is too fast, use the slower < code > press_keys()</ code > to avoid detection. You can also use < code > sb.sleep(seconds)</ code > to slow things down.</ p >
2786
+ < p > To use WebDriver methods again, call:</ p >
2787
+ < ul >
2788
+ < li > < strong > < code > sb.reconnect()</ code > </ strong > or < strong > < code > sb.connect()</ code > </ strong > </ li >
2789
+ </ ul >
2790
+ < p > (Note that reconnecting allows anti-bots to detect you, so only reconnect if it is safe to do so.)</ p >
2791
+ < p > To disconnect again, call:</ p >
2792
+ < ul >
2793
+ < li > < strong > < code > sb.disconnect()</ code > </ strong > </ li >
2794
+ </ ul >
2795
+ < p > While disconnected, if you accidentally call a WebDriver method, then SeleniumBase will attempt to use the CDP Mode version of that method (if available). For example, if you accidentally call < code > sb.click(selector)</ code > instead of < code > sb.cdp.click(selector)</ code > , then your WebDriver call will automatically be redirected to the CDP Mode version. Not all WebDriver methods have a matching CDP Mode method. In that scenario, calling a WebDriver method while disconnected could raise an error, or make WebDriver automatically reconnect first.</ p >
2796
+ < p > To find out if WebDriver is connected or disconnected, call:</ p >
2797
+ < ul >
2798
+ < li > < strong > < code > sb.is_connected()</ code > </ strong > </ li >
2799
+ </ ul >
2757
2800
< hr />
2758
2801
< h3 id ="cdp-mode-examples "> 🐙 < b translate ="no "> CDP Mode</ b > examples< a class ="headerlink " href ="#cdp-mode-examples " title ="Permanent link "> ¶</ a > </ h3 >
2759
2802
< blockquote >
@@ -2772,13 +2815,15 @@ <h3 id="example-1-pokemon-site-using-incapsulaimperva-protection-with-invisible-
2772
2815
< span class ="k "> with</ span > < span class ="n "> SB</ span > < span class ="p "> (</ span > < span class ="n "> uc</ span > < span class ="o "> =</ span > < span class ="kc "> True</ span > < span class ="p "> ,</ span > < span class ="n "> test</ span > < span class ="o "> =</ span > < span class ="kc "> True</ span > < span class ="p "> ,</ span > < span class ="n "> locale_code</ span > < span class ="o "> =</ span > < span class ="s2 "> "en"</ span > < span class ="p "> )</ span > < span class ="k "> as</ span > < span class ="n "> sb</ span > < span class ="p "> :</ span >
2773
2816
< span class ="n "> url</ span > < span class ="o "> =</ span > < span class ="s2 "> "https://www.pokemon.com/us"</ span >
2774
2817
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> activate_cdp_mode</ span > < span class ="p "> (</ span > < span class ="n "> url</ span > < span class ="p "> )</ span >
2775
- < span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> sleep</ span > < span class ="p "> (</ span > < span class ="mi "> 1</ span > < span class ="p "> )</ span >
2818
+ < span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> sleep</ span > < span class ="p "> (</ span > < span class ="mf "> 1.5 </ span > < span class ="p "> )</ span >
2776
2819
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> click_if_visible</ span > < span class ="p "> (</ span > < span class ="s2 "> "button#onetrust-reject-all-handler"</ span > < span class ="p "> )</ span >
2820
+ < span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> sleep</ span > < span class ="p "> (</ span > < span class ="mf "> 0.5</ span > < span class ="p "> )</ span >
2777
2821
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> click</ span > < span class ="p "> (</ span > < span class ="s1 "> 'a[href="https://www.pokemon.com/us/pokedex/"]'</ span > < span class ="p "> )</ span >
2778
2822
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> sleep</ span > < span class ="p "> (</ span > < span class ="mi "> 1</ span > < span class ="p "> )</ span >
2779
2823
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> click</ span > < span class ="p "> (</ span > < span class ="s1 "> 'b:contains("Show Advanced Search")'</ span > < span class ="p "> )</ span >
2780
2824
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> sleep</ span > < span class ="p "> (</ span > < span class ="mi "> 1</ span > < span class ="p "> )</ span >
2781
2825
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> click</ span > < span class ="p "> (</ span > < span class ="s1 "> 'span[data-type="type"][data-value="electric"]'</ span > < span class ="p "> )</ span >
2826
+ < span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> sleep</ span > < span class ="p "> (</ span > < span class ="mf "> 0.5</ span > < span class ="p "> )</ span >
2782
2827
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> click</ span > < span class ="p "> (</ span > < span class ="s2 "> "a#advSearch"</ span > < span class ="p "> )</ span >
2783
2828
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> sleep</ span > < span class ="p "> (</ span > < span class ="mi "> 1</ span > < span class ="p "> )</ span >
2784
2829
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> click</ span > < span class ="p "> (</ span > < span class ="s1 "> 'img[src*="img/pokedex/detail/025.png"]'</ span > < span class ="p "> )</ span >
@@ -2825,7 +2870,7 @@ <h3 id="example-2-hyatt-site-using-kasada-protection">🔖 Example 2: (Hyatt sit
2825
2870
< span class ="k "> with</ span > < span class ="n "> SB</ span > < span class ="p "> (</ span > < span class ="n "> uc</ span > < span class ="o "> =</ span > < span class ="kc "> True</ span > < span class ="p "> ,</ span > < span class ="n "> test</ span > < span class ="o "> =</ span > < span class ="kc "> True</ span > < span class ="p "> ,</ span > < span class ="n "> locale_code</ span > < span class ="o "> =</ span > < span class ="s2 "> "en"</ span > < span class ="p "> )</ span > < span class ="k "> as</ span > < span class ="n "> sb</ span > < span class ="p "> :</ span >
2826
2871
< span class ="n "> url</ span > < span class ="o "> =</ span > < span class ="s2 "> "https://www.hyatt.com/"</ span >
2827
2872
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> activate_cdp_mode</ span > < span class ="p "> (</ span > < span class ="n "> url</ span > < span class ="p "> )</ span >
2828
- < span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> sleep</ span > < span class ="p "> (</ span > < span class ="mi "> 1</ span > < span class ="p "> )</ span >
2873
+ < span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> sleep</ span > < span class ="p "> (</ span > < span class ="mf "> 1.5 </ span > < span class ="p "> )</ span >
2829
2874
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> click_if_visible</ span > < span class ="p "> (</ span > < span class ="s1 "> 'button[aria-label="Close"]'</ span > < span class ="p "> )</ span >
2830
2875
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> sleep</ span > < span class ="p "> (</ span > < span class ="mf "> 0.5</ span > < span class ="p "> )</ span >
2831
2876
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> click</ span > < span class ="p "> (</ span > < span class ="s1 "> 'span:contains("Explore")'</ span > < span class ="p "> )</ span >
@@ -2907,10 +2952,14 @@ <h3 id="example-3-bestwestern-site-using-datadome-protection">🔖 Example 3: (B
2907
2952
< h3 id ="cdp-mode-api-methods "> 🐙 CDP Mode API / Methods< a class ="headerlink " href ="#cdp-mode-api-methods " title ="Permanent link "> ¶</ a > </ h3 >
2908
2953
< p > (Some method args have been left out for simplicity. Eg: < code translate ="no "> timeout</ code > )</ p >
2909
2954
< div class ="highlight "> < pre > < span > </ span > < code > < span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> get</ span > < span class ="p "> (</ span > < span class ="n "> url</ span > < span class ="p "> )</ span >
2910
- < span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> reload</ span > < span class ="p "> ()</ span >
2955
+ < span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> open</ span > < span class ="p "> (</ span > < span class ="n "> url</ span > < span class ="p "> )</ span >
2956
+ < span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> reload</ span > < span class ="p "> (</ span > < span class ="n "> ignore_cache</ span > < span class ="o "> =</ span > < span class ="kc "> True</ span > < span class ="p "> ,</ span > < span class ="n "> script_to_evaluate_on_load</ span > < span class ="o "> =</ span > < span class ="kc "> None</ span > < span class ="p "> )</ span >
2911
2957
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> refresh</ span > < span class ="p "> ()</ span >
2958
+ < span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> get_event_loop</ span > < span class ="p "> ()</ span >
2912
2959
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> add_handler</ span > < span class ="p "> (</ span > < span class ="n "> event</ span > < span class ="p "> ,</ span > < span class ="n "> handler</ span > < span class ="p "> )</ span >
2913
2960
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> find_element</ span > < span class ="p "> (</ span > < span class ="n "> selector</ span > < span class ="p "> )</ span >
2961
+ < span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> find</ span > < span class ="p "> (</ span > < span class ="n "> selector</ span > < span class ="p "> )</ span >
2962
+ < span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> locator</ span > < span class ="p "> (</ span > < span class ="n "> selector</ span > < span class ="p "> )</ span >
2914
2963
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> find_all</ span > < span class ="p "> (</ span > < span class ="n "> selector</ span > < span class ="p "> )</ span >
2915
2964
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> find_elements_by_text</ span > < span class ="p "> (</ span > < span class ="n "> text</ span > < span class ="p "> ,</ span > < span class ="n "> tag_name</ span > < span class ="o "> =</ span > < span class ="kc "> None</ span > < span class ="p "> )</ span >
2916
2965
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> select</ span > < span class ="p "> (</ span > < span class ="n "> selector</ span > < span class ="p "> )</ span >
@@ -2924,6 +2973,7 @@ <h3 id="cdp-mode-api-methods">🐙 CDP Mode API / Methods<a class="headerlink" h
2924
2973
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> clear_cookies</ span > < span class ="p "> (</ span > < span class ="o "> *</ span > < span class ="n "> args</ span > < span class ="p "> ,</ span > < span class ="o "> **</ span > < span class ="n "> kwargs</ span > < span class ="p "> )</ span >
2925
2974
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> sleep</ span > < span class ="p "> (</ span > < span class ="n "> seconds</ span > < span class ="p "> )</ span >
2926
2975
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> bring_active_window_to_front</ span > < span class ="p "> ()</ span >
2976
+ < span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> bring_to_front</ span > < span class ="p "> ()</ span >
2927
2977
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> get_active_element</ span > < span class ="p "> ()</ span >
2928
2978
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> get_active_element_css</ span > < span class ="p "> ()</ span >
2929
2979
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> click</ span > < span class ="p "> (</ span > < span class ="n "> selector</ span > < span class ="p "> )</ span >
@@ -2950,7 +3000,7 @@ <h3 id="cdp-mode-api-methods">🐙 CDP Mode API / Methods<a class="headerlink" h
2950
3000
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> set_window_rect</ span > < span class ="p "> ()</ span >
2951
3001
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> reset_window_size</ span > < span class ="p "> ()</ span >
2952
3002
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> get_window</ span > < span class ="p "> ()</ span >
2953
- < span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> get_text</ span > < span class ="p "> ()</ span >
3003
+ < span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> get_text</ span > < span class ="p "> (</ span > < span class =" n " > selector </ span > < span class =" p " > )</ span >
2954
3004
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> get_title</ span > < span class ="p "> ()</ span >
2955
3005
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> get_current_url</ span > < span class ="p "> ()</ span >
2956
3006
< span class ="n "> sb</ span > < span class ="o "> .</ span > < span class ="n "> cdp</ span > < span class ="o "> .</ span > < span class ="n "> get_origin</ span > < span class ="p "> ()</ span >
0 commit comments