def get_web_driver(email, password, code_provider): driver = Chrome() driver.get("https://www.mint.com") driver.implicitly_wait(20) # seconds driver.find_element_by_link_text("Log In").click() driver.find_element_by_id("ius-userid").send_keys(email) driver.find_element_by_id("ius-password").send_keys(password) driver.find_element_by_id("ius-sign-in-submit-btn").submit() # Wait until logged in, just in case we need to deal with MFA. while not driver.current_url.startswith( 'https://mint.intuit.com/overview.event'): time.sleep(2) try: mfa_ele = driver.find_element_by_id("ius-mfa-option-email") mfa_ele.click() driver.find_element_by_id("ius-mfa-options-submit-btn").click() verification_code = code_provider() driver.find_element_by_id("ius-mfa-confirm-code").send_keys( verification_code) driver.find_element_by_id("ius-mfa-otp-submit-btn").submit() except: pass # Wait until the overview page has actually loaded. driver.implicitly_wait(20) # seconds driver.find_element_by_id("transaction") return driver
def get_web_driver(email, password): driver = Chrome() driver.get("https://www.mint.com") driver.implicitly_wait(20) # seconds driver.find_element_by_link_text("Log In").click() driver.find_element_by_id("ius-userid").send_keys(email) driver.find_element_by_id("ius-password").send_keys(password) driver.find_element_by_id("ius-sign-in-submit-btn").submit() # Wait until logged in, just in case we need to deal with MFA. while not driver.current_url.startswith( 'https://mint.intuit.com/overview.event'): time.sleep(1) # Wait until the overview page has actually loaded. driver.implicitly_wait(20) # seconds driver.find_element_by_id("transaction") return driver
def get_web_driver(email, password): driver = Chrome() driver.get("https://www.mint.com") driver.implicitly_wait(20) # seconds driver.find_element_by_link_text("Log In").click() driver.find_element_by_id("ius-userid").send_keys(email) driver.find_element_by_id("ius-password").send_keys(password) driver.find_element_by_id("ius-sign-in-submit-btn").submit() # Wait until logged in, just in case we need to deal with MFA. while not driver.current_url.startswith( 'https://mint.intuit.com/overview.event'): time.sleep(1) # Wait until the overview page has actually loaded. driver.implicitly_wait(20) # seconds driver.find_element_by_id("transaction") return driver
def get_web_driver(email, password, headless=False, mfa_method=None, mfa_input_callback=None, wait_for_sync=True, session_path=None, imap_account=None, imap_password=None, imap_server=None, imap_folder="INBOX"): if headless and mfa_method is None: warnings.warn("Using headless mode without specifying an MFA method" "is unlikely to lead to a successful login. Defaulting --mfa-method=sms") mfa_method = "sms" zip_type = "" executable_path = os.getcwd() + os.path.sep + 'chromedriver' if _platform in ['win32', 'win64']: executable_path += '.exe' zip_type = CHROME_ZIP_TYPES.get(_platform) if not os.path.exists(executable_path): zip_file_url = CHROME_DRIVER_BASE_URL % (CHROME_DRIVER_VERSION, zip_type) request = requests.get(zip_file_url) if request.status_code != 200: raise RuntimeError('Error finding chromedriver at %r, status = %d' % (zip_file_url, request.status_code)) zip_file = zipfile.ZipFile(io.BytesIO(request.content)) zip_file.extractall() os.chmod(executable_path, 0o755) chrome_options = ChromeOptions() if headless: chrome_options.add_argument('headless') chrome_options.add_argument('no-sandbox') chrome_options.add_argument('disable-dev-shm-usage') chrome_options.add_argument('disable-gpu') # chrome_options.add_argument("--window-size=1920x1080") if session_path is not None: chrome_options.add_argument("user-data-dir=%s" % session_path) driver = Chrome(chrome_options=chrome_options, executable_path="%s" % executable_path) driver.get("https://www.mint.com") driver.implicitly_wait(20) # seconds try: element = driver.find_element_by_link_text("Log In") except NoSuchElementException: # when user has cookies, a slightly different front page appears driver.implicitly_wait(0) # seconds element = driver.find_element_by_link_text("LOG IN") driver.implicitly_wait(20) # seconds element.click() time.sleep(1) email_input = driver.find_element_by_id("ius-userid") # It's possible that the user clicked "remember me" at some point, causing # the email to already be present. If anything is in the input, clear it # and use the provided email, just to be safe. # email_input.setAttribute("value", "") email_input.clear() email_input.send_keys(email) driver.find_element_by_id("ius-password").send_keys(password) driver.find_element_by_id("ius-sign-in-submit-btn").submit() # Wait until logged in, just in case we need to deal with MFA. while not driver.current_url.startswith( 'https://mint.intuit.com/overview.event'): # An implicitly_wait is also necessary here to avoid getting stuck on # find_element_by_id while the page is still in transition. driver.implicitly_wait(1) time.sleep(1) # bypass "Let's add your current mobile number" interstitial page try: skip_for_now = driver.find_element_by_id('ius-verified-user-update-btn-skip') skip_for_now.click() except (NoSuchElementException, StaleElementReferenceException, ElementNotVisibleException): pass driver.implicitly_wait(1) # seconds try: driver.find_element_by_id('ius-mfa-options-form') try: mfa_method_option = driver.find_element_by_id('ius-mfa-option-{}'.format(mfa_method)) mfa_method_option.click() mfa_method_submit = driver.find_element_by_id("ius-mfa-options-submit-btn") mfa_method_submit.click() if mfa_method == 'email' and imap_account: mfa_code = get_email_code(imap_account, imap_password, imap_server, imap_folder=imap_folder) else: mfa_code = (mfa_input_callback or input)("Please enter your 6-digit MFA code: ") mfa_code_input = driver.find_element_by_id("ius-mfa-confirm-code") mfa_code_input.send_keys(mfa_code) mfa_code_submit = driver.find_element_by_id("ius-mfa-otp-submit-btn") mfa_code_submit.click() except Exception: # if anything goes wrong for any reason, give up on MFA mfa_method = None warnings.warn("Giving up on handling MFA. Please complete " "the MFA process manually in the browser.") except NoSuchElementException: pass finally: driver.implicitly_wait(20) # seconds # Wait until the overview page has actually loaded, and if wait_for_sync==True, sync has completed. if wait_for_sync: try: # Status message might not be present straight away. Seems to be due # to dynamic content (client side rendering). status_message = WebDriverWait(driver, 30).until( expected_conditions.visibility_of_element_located( (By.CSS_SELECTOR, ".SummaryView .message"))) WebDriverWait(driver, 5 * 60).until( lambda x: "Account refresh complete" in status_message.get_attribute('innerHTML') ) except (TimeoutException, StaleElementReferenceException): warnings.warn("Mint sync apparently incomplete after 5 minutes. Data " "retrieved may not be current.") else: driver.find_element_by_id("transaction") return driver
def get_web_driver(email, password, headless=False, mfa_method=None, mfa_input_callback=None, wait_for_sync=True): if headless and mfa_method is None: warnings.warn("Using headless mode without specifying an MFA method" "is unlikely to lead to a successful login. Defaulting --mfa-method=sms") mfa_method = "sms" zip_type = "" executable_path = os.getcwd() if _platform == "linux" or _platform == "linux2": zip_type = 'linux' executable_path += "/chromedriver" elif _platform == "darwin": zip_type = 'mac' executable_path += "/chromedriver" elif _platform == "win32" or _platform == "win64": zip_type = 'win' executable_path += "/chromedriver.exe" if not os.path.exists(executable_path): zip_file_url = 'https://chromedriver.storage.googleapis.com/%s/chromedriver_%s64.zip' % (CHROME_DRIVER_VERSION, zip_type) request = requests.get(zip_file_url) zip_file = zipfile.ZipFile(io.BytesIO(request.content)) zip_file.extractall() os.chmod(executable_path, 0o755) chrome_options = ChromeOptions() if headless: chrome_options.add_argument('headless') chrome_options.add_argument('no-sandbox') chrome_options.add_argument('disable-dev-shm-usage') chrome_options.add_argument('disable-gpu') # chrome_options.add_argument("--window-size=1920x1080") driver = Chrome(chrome_options=chrome_options, executable_path="%s" % executable_path) driver.get("https://www.mint.com") driver.implicitly_wait(20) # seconds driver.find_element_by_link_text("Log In").click() driver.find_element_by_id("ius-userid").send_keys(email) driver.find_element_by_id("ius-password").send_keys(password) driver.find_element_by_id("ius-sign-in-submit-btn").submit() # Wait until logged in, just in case we need to deal with MFA. while not driver.current_url.startswith( 'https://mint.intuit.com/overview.event'): time.sleep(1) driver.implicitly_wait(1) # seconds try: driver.find_element_by_id('ius-mfa-options-form') try: mfa_method_option = driver.find_element_by_id('ius-mfa-option-{}'.format(mfa_method)) mfa_method_option.click() mfa_method_submit = driver.find_element_by_id("ius-mfa-options-submit-btn") mfa_method_submit.click() mfa_code = (mfa_input_callback or input)("Please enter your 6-digit MFA code: ") mfa_code_input = driver.find_element_by_id("ius-mfa-confirm-code") mfa_code_input.send_keys(mfa_code) mfa_code_submit = driver.find_element_by_id("ius-mfa-otp-submit-btn") mfa_code_submit.click() except Exception: # if anything goes wrong for any reason, give up on MFA mfa_method = None warnings.warn("Giving up on handling MFA. Please complete " "the MFA process manually in the browser.") except NoSuchElementException: pass finally: driver.implicitly_wait(20) # seconds # Wait until the overview page has actually loaded, and if wait_for_sync==True, sync has completed. if wait_for_sync: status_message = driver.find_element_by_css_selector(".SummaryView .message") try: WebDriverWait(driver, 5 * 60).until( lambda x: status_message.get_attribute('innerHTML') == "Account refresh completed." ) except TimeoutException: warnings.warn("Mint sync apparently incomplete after 5 minutes. Data " "retrieved may not be current.") else: driver.find_element_by_id("transaction") return driver
def get_web_driver(email, password, headless=False, mfa_method=None, mfa_input_callback=None, wait_for_sync=True, session_path=None, imap_account=None, imap_password=None, imap_server=None, imap_folder="INBOX"): if headless and mfa_method is None: warnings.warn("Using headless mode without specifying an MFA method" "is unlikely to lead to a successful login. Defaulting --mfa-method=sms") mfa_method = "sms" zip_type = "" executable_path = os.getcwd() + os.path.sep + 'chromedriver' if _platform in ['win32', 'win64']: executable_path += '.exe' zip_type = CHROME_ZIP_TYPES.get(_platform) if not os.path.exists(executable_path): zip_file_url = CHROME_DRIVER_BASE_URL % (CHROME_DRIVER_VERSION, zip_type) request = requests.get(zip_file_url) if request.status_code != 200: raise RuntimeError('Error finding chromedriver at %r, status = %d' % (zip_file_url, request.status_code)) zip_file = zipfile.ZipFile(io.BytesIO(request.content)) zip_file.extractall() os.chmod(executable_path, 0o755) chrome_options = ChromeOptions() if headless: chrome_options.add_argument('headless') chrome_options.add_argument('no-sandbox') chrome_options.add_argument('disable-dev-shm-usage') chrome_options.add_argument('disable-gpu') # chrome_options.add_argument("--window-size=1920x1080") if session_path is not None: chrome_options.add_argument("user-data-dir=%s" % session_path) driver = Chrome(chrome_options=chrome_options, executable_path="%s" % executable_path) driver.get("https://www.mint.com") driver.implicitly_wait(20) # seconds try: element = driver.find_element_by_link_text("Log In") except NoSuchElementException: # when user has cookies, a slightly different front page appears driver.implicitly_wait(0) # seconds element = driver.find_element_by_link_text("LOG IN") driver.implicitly_wait(20) # seconds element.click() time.sleep(1) driver.find_element_by_id("ius-userid").send_keys(email) driver.find_element_by_id("ius-password").send_keys(password) driver.find_element_by_id("ius-sign-in-submit-btn").submit() # Wait until logged in, just in case we need to deal with MFA. while not driver.current_url.startswith( 'https://mint.intuit.com/overview.event'): time.sleep(1) driver.implicitly_wait(1) # seconds try: driver.find_element_by_id('ius-mfa-options-form') try: mfa_method_option = driver.find_element_by_id('ius-mfa-option-{}'.format(mfa_method)) mfa_method_option.click() mfa_method_submit = driver.find_element_by_id("ius-mfa-options-submit-btn") mfa_method_submit.click() if mfa_method == 'email' and imap_account: mfa_code = get_email_code(imap_account, imap_password, imap_server, imap_folder=imap_folder) else: mfa_code = (mfa_input_callback or input)("Please enter your 6-digit MFA code: ") mfa_code_input = driver.find_element_by_id("ius-mfa-confirm-code") mfa_code_input.send_keys(mfa_code) mfa_code_submit = driver.find_element_by_id("ius-mfa-otp-submit-btn") mfa_code_submit.click() except Exception: # if anything goes wrong for any reason, give up on MFA mfa_method = None warnings.warn("Giving up on handling MFA. Please complete " "the MFA process manually in the browser.") except NoSuchElementException: pass finally: driver.implicitly_wait(20) # seconds # Wait until the overview page has actually loaded, and if wait_for_sync==True, sync has completed. if wait_for_sync: status_message = driver.find_element_by_css_selector(".SummaryView .message") try: WebDriverWait(driver, 5 * 60).until( lambda x: "Account refresh complete" in status_message.get_attribute('innerHTML') ) except TimeoutException: warnings.warn("Mint sync apparently incomplete after 5 minutes. Data " "retrieved may not be current.") else: driver.find_element_by_id("transaction") return driver