877877 < ul class ="md-nav__list ">
878878
879879 < 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 ">
881881 < 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
883892 </ span >
884893 </ a >
885894
26472656 < ul class ="md-nav__list ">
26482657
26492658 < 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 ">
26512669 < span class ="md-ellipsis ">
2652- 🐙 CDP Mode initialization
2670+ 🐙 Here are some common sb.cdp methods
26532671 </ span >
26542672 </ a >
26552673
@@ -2736,7 +2754,7 @@ <h1>🐙 CDP Mode</h1>
27362754< 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 >
27372755< 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 >
27382756< 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 >
27402758< p > 🐙 < b translate ="no "> CDP Mode</ b > includes multiple updates to the above, such as:</ p >
27412759< ul >
27422760< 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
27472765< li > Faster response time for support. (Eg. < a href ="https://discord.gg/EdhQTn3EyE "> Discord Chat</ a > )</ li >
27482766</ ul >
27492767< 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 >
27512769< ul >
2752- < li > < code > sb.activate_cdp_mode(url)</ code > </ li >
2770+ < li > < strong > < code > sb.activate_cdp_mode(url)</ code > </ strong > </ li >
27532771</ ul >
27542772< blockquote >
27552773< p > (Call that from a < strong > UC Mode</ strong > script)</ p >
27562774</ 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 >
27572800< hr />
27582801< h3 id ="cdp-mode-examples "> 🐙 < b translate ="no "> CDP Mode</ b > examples< a class ="headerlink " href ="#cdp-mode-examples " title ="Permanent link "> ¶</ a > </ h3 >
27592802< blockquote >
@@ -2772,13 +2815,15 @@ <h3 id="example-1-pokemon-site-using-incapsulaimperva-protection-with-invisible-
27722815< 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 >
27732816 < span class ="n "> url</ span > < span class ="o "> =</ span > < span class ="s2 "> "https://www.pokemon.com/us"</ span >
27742817 < 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 >
27762819 < 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 >
27772821 < 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 >
27782822 < 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 >
27792823 < 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 >
27802824 < 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 >
27812825 < 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 >
27822827 < 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 >
27832828 < 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 >
27842829 < 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
28252870< 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 >
28262871 < span class ="n "> url</ span > < span class ="o "> =</ span > < span class ="s2 "> "https://www.hyatt.com/"</ span >
28272872 < 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 >
28292874 < 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 >
28302875 < 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 >
28312876 < 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
29072952< h3 id ="cdp-mode-api-methods "> 🐙 CDP Mode API / Methods< a class ="headerlink " href ="#cdp-mode-api-methods " title ="Permanent link "> ¶</ a > </ h3 >
29082953< p > (Some method args have been left out for simplicity. Eg: < code translate ="no "> timeout</ code > )</ p >
29092954< 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 >
29112957< 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 >
29122959< 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 >
29132960< 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 >
29142963< 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 >
29152964< 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 >
29162965< 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
29242973< 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 >
29252974< 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 >
29262975< 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 >
29272977< 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 >
29282978< 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 >
29292979< 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
29503000< 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 >
29513001< 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 >
29523002< 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 >
29543004< 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 >
29553005< 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 >
29563006< 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