################## NODRIVER ################## `CLICK HERE FOR DOCS `_ ____ **This package provides next level webscraping and browser automation using a relatively simple interface.** * **This is the official successor of the** `Undetected-Chromedriver `_ **python package.** * **No more webdriver, no more selenium** Direct communication provides even better resistance against web applicatinon firewalls (WAF's), while performance gets a massive boost. This module is, contrary to undetected-chromedriver, fully asynchronous. What makes this package different from other known packages, is the optimization to stay undetected for most anti-bot solutions. Another focus point is usability and quick prototyping, so expect a lot to work `-as is-` , with most method parameters having `best practice` defaults. Using 1 or 2 lines, this is up and running, providing best practice config by default. While usability and convenience is important. It's also easy to fully customizable everything using the entire array of `CDP `_ domains, methods and events available. .. video:: cf_verify_.mp4 :autoplay: :playsinline: :muted: :width: 500 Some features ^^^^^^^^^^^^^^^^^^^^^^ * A blazing fast undetected chrome (-ish) automation library * No chromedriver binary or Selenium dependency * This equals bizarre performance increase and less detections! * Up and running in 1 line of code* * uses fresh profile on each run, cleans up on exit * save and load cookies to file to not repeat tedious login steps * smart element lookup, by selector or text, including iframe content. this could also be used as wait condition for a element to appear, since it will retry for the duration of until found. single element lookup by text using tab.find(), accepts a best_match flag, which will not naively return the first match, but will match candidates by closest matching text length. * descriptive __repr__ for elements, which represent the element as html * utility function to convert a running undetected_chromedriver.Chrome instance to a nodriver.Browser instance and contintue from there * packed with helpers and utility methods for most used and important operations .. * ```elem.text``` * ```elem.text_all``` * ```elem.parent.parent.parent.attrs``` * ```anchor_elem.href and anchor_elem['href']``` * ```anchor_elem.href = 'someotherthing'; await anchor_elem.save()``` * ```elem.children[-1].children[0].children[4].parent.parent``` * ```await html5video_element.record_video()``` * ```await html5video_element('pause')``` * ```await html5video_element.apply('''(el) => el.currentTime = 0''')``` * ```tab = await browser.get(url, new_tab=True)``` * ```tab_win = await browser.get(url, new_window=True)``` * ```first = await tab.find('search text')``` * ```best = await tab.find('search text', best_match=True)``` * ```all_results = await tab.find_all('search text')``` * ```first_submit_button = await tab.select(selector='button[type=submit]')``` * ```inputs_in_form = await tab.select_all('form input')``` Quick start -------------- .. toctree:: nodriver/quickstart Main objects -------------- .. toctree:: nodriver/classes/browser nodriver/classes/tab nodriver/classes/element nodriver/classes/others_and_helpers CDP object ------------------ .. toctree:: nodriver/cdp