Exemple #1
0
    def test_required_fields(self):
        """ test_authentication.py:TestLogin.test_required_fields """
        # assert 'Sign In' page inputs are required as expected
        credentials = self.nicol.credentials
        signin_page = self.nicol.signin_page

        if not main.is_web():
            self.assertTrue(signin_page.on())
        else:
            signin_page.go()
        signin_page.click_login()

        error = 'Required'
        num_errors = 2
        self.WDWait.until(
            EC.text_to_be_present_in_element(
                (By.ID, 'signin_form_user_helper'), error))
        self.assertEqual(2, signin_page.number_of_elements('p', error))

        # ios can't tell that email was updated so there's still 2 errors
        if not main.is_ios():
            signin_page.set_email(credentials['email'])
            self.WDWait.until(
                EC.text_to_be_present_in_element(
                    (By.ID, 'signin_form_pw_helper'), error))
            num_errors = 1
            self.assertEqual(1, signin_page.number_of_elements('p', error))
            signin_page.set_password(credentials['password'])

            self.assertEqual(0, signin_page.number_of_elements('p', error))
Exemple #2
0
 def load_body(self):
     self.toast = (self.driver.find_element_by_class_name("sm-secret-code"))
     self.code = self.read_code()
     self.form = self.driver.find_element_by_tag_name('form')
     self.code_input = self.form.find_element_by_tag_name('input')
     # self.wrong_email_button = self.driver.find_element_by_name()
     if main.is_web():  # no continue button on native
         self.continue_button = self.form.find_element_by_tag_name('button')
Exemple #3
0
    def test_invalid_inputs(self):
        """ test_authentication.py:TestLogin.test_invalid_inputs """
        # Running this test > once might put your computer out of commission for
        # 15 minutes because it thinks you're trying to hack into accounts

        # assert 'Sign In' page handles invalid input as expected
        credentials = self.nicol.credentials
        signin_page = self.nicol.signin_page

        if not main.is_web():
            self.assertTrue(signin_page.on())
        else:
            signin_page.go()
        # signin_page.set_password(credentials['password'])
        signin_page.submit('', credentials['password'], False)
        invalid_emails = ['invalid', 'invalid@', 'invalid.com']

        containers = ["div", "p", "div"]
        # errors = ["Incorrect password, email address, or phone number.",
        # 	"Please enter a valid email address, mobile phone number, or username.",
        # 	"Incorrect password, email address, or phone number."
        # ]
        error = "Please enter a valid email address."
        # errors = ["Incorrect password, email address, or phone number.",
        # 	"Please enter a valid email address.",
        # 	"Incorrect password, email address, or phone number."
        # ]
        for i, email in enumerate(invalid_emails):
            signin_page.submit(invalid_emails[i], credentials['password'])
            signin_page.check_captcha()

            # Wait for errors to show up
            if i == 1:  # email input error
                # Validation changed on form at some point 4/10/2018
                # Fails to submit, but no error.
                pass
                # print('i: ' + str(i))
                # self.WDWait.until(
                # 	EC.text_to_be_present_in_element((By.ID, 'signin_form_user_helper'),
                # 		errors[i]))
            else:  # form error
                print('i= ' + str(i))
                # self.WDWait.until(
                # EC.text_to_be_present_in_element((By.ID, 'sendmi_error'), error))
                self.WDWait.until(
                    EC.presence_of_element_located(
                        (By.CLASS_NAME, 'alert-danger')))

                self.assertEqual(1,
                                 signin_page.number_of_elements('span', error))

        invalid_phones = ['1234567890', '801123456']
        for phone in invalid_phones:
            error = "Please enter a valid email address, mobile phone number, or username."

            signin_page.submit(phone, credentials['password'])
Exemple #4
0
 def load_body(self):
     self.code = self.get_code()
     self.form = self.load_form()
     # Friday: clicking doesn't seem to work (desktop chrome)
     # self.wrong_link = self.form.find_element_by_tag_name('a')
     self.code_input = self.form.find_element_by_tag_name('input')
     # no continue button on native app
     if main.is_web():
         self.continue_button = (
             self.form.find_element_by_class_name('primaryButton'))
Exemple #5
0
 def go(self, url=None):
     """Go to URL of page. *Web only*"""
     if main.is_web():
         if url is None:
             self.driver.get(Page.base_url + self.url_tail)
         elif Page.base_url not in url:
             self.driver.get(Page.base_url + url)
         else:
             self.driver.get(url)
         return self.on()
Exemple #6
0
    def test_remember_me(self):
        """ test_authentication.py:TestRemember.test_remember_me """
        # Web: Remember me functionality works as expected
        # Native: Remember me functionality works automatically
        credentials = self.nicol.credentials
        for_employers = self.nicol.for_employers
        signin_page = self.nicol.signin_page
        signin_code_page = self.nicol.signin_code_page
        lobby_page = self.nicol.lobby_page

        # Login and 'remember me'
        if main.is_web():
            for_employers.go()
            self.assertTrue(for_employers.on())  #scrollTo element.
            for_employers.footer.click_link('sign in')

        self.assertTrue(signin_page.on())
        self.assertTrue(signin_page.is_public())
        signin_page.submit(credentials['email'], credentials['password'])

        self.assertTrue(signin_code_page.on())
        self.assertTrue(signin_code_page.is_public())
        # Remember me should work automatically on native app
        if main.is_web():
            signin_code_page.click_remember()
        signin_code_page.enter_code()
        WebDriverWait(self.driver, 20).until(
            EC.presence_of_element_located(
                (By.CLASS_NAME, 'invitations_card')))

        self.assertTrue(lobby_page.on())
        lobby_page.menu.sign_out()

        # Sign back in. Should remember and skip code page
        if main.is_web():
            self.assertTrue(for_employers.on())
            for_employers.footer.click_link('sign in')
        self.assertTrue(signin_page.on())
        self.assertTrue(signin_page.is_public())
        signin_page.submit(credentials['email'], credentials['password'])

        self.assertTrue(lobby_page.on())
Exemple #7
0
 def scroll_input_into_view(self):
     # Mobile: scroll so input in view
     if not main.is_desktop():
         el_bottom = self.get_el_location(self.code_input, 'bottom')
         window_height = self.get_window_height()
         # add 48 for continue button. Extra for ios web footer
         ios_footer = 0
         if main.is_ios() and main.is_web():
             ios_footer = 40
         scroll_distance = el_bottom - window_height + 48 + ios_footer
         self.move('down', scroll_distance)
Exemple #8
0
 def load(self):
     try:
         self.nav = NavigationFunctions(self.driver)
         self.load_body()
         self.header = header.PrivateHeader(self.driver)
         self.menu = menu.SideMenu(self.driver)
         if main.is_web() and main.is_ios():
             self.clear_ios_footer()
         return True
     except (NoSuchElementException, StaleElementReferenceException) as e:
         return False
Exemple #9
0
    def test_invalid_inputs(self):
        """ test_authentication.py:TestForgotPassword.test_invalid_inputs """
        # assert inputs on 'Reset Password' page handle invalid credentials

        credentials = self.nicol.credentials
        signin_page = self.nicol.signin_page
        reset_page = self.nicol.reset_password_page
        email_page = self.nicol.reset_password_email_page

        # go to reset password page
        if main.is_web():
            self.assertTrue(reset_page.go())
        else:
            self.assertTrue(signin_page.on())
            signin_page.click_password_reset()
            self.assertTrue(reset_page.on())

        invalid_emails = [
            'invalid', 'invalid@', 'invalid.com', '*****@*****.**'
        ]
        error = "Invalid email address"
        for email in invalid_emails:
            reset_page.submit(email)
            time.sleep(.8)
            self.assertEqual(  # /reset-password validation fails
                1, reset_page.number_of_elements(
                    'div',
                    error))  #Failed 6/6 3:49pm Accepts invalid inputs. Logged.
        invalid_phones = ['1234567890', '801123456']
        for phone in invalid_phones:
            error = (
                "\"{phone}\" is not a valid phone number in the United States."
            )
            reset_page.submit(email)
            time.sleep(.8)
            self.assertEqual(
                1,
                reset_page.number_of_elements('div',
                                              error.format(phone=phone)))
        dne_ids = ['(801) 890-1234', '*****@*****.**']
        for dne_id in dne_ids:
            reset_page.request(dne_id)
            time.sleep(.8)
            self.assertTrue(reset_page.no_user_found(dne_id))
        reset_page.request(credentials['email'])

        email_page.load()
        email_page.set_passwords('a')
        email_page.click_continue()
        error = "Shorter than minimum length 8"
        self.assertEqual(1, email_page.number_of_elements('div', error))
        #No matching passwords check...
        '''error = "The passwords must match."
Exemple #10
0
	def confirm_sign_out(self):
		# mobile personal settings page has extra sign out option
		button = self.driver.find_element_by_class_name('logout_ok')
		button.click()
		try:
			if main.is_web():
				# Goes to home page
				# WDW(self.driver, 10).until(EC.presence_of_element_located((By.ID, 'contactEmail2')))
				WDW(self.driver, 10).until(EC.presence_of_element_located((By.ID, 'empEnroll')))
			else: # Native: goes to signin page
				 WDW(self.driver, 10).until(EC.element_to_be_clickable((By.ID, 'submit_si_button')))
		except TimeoutException:
			raise Exception("Menu: Could not find expected element after logout.")
Exemple #11
0
    def test_employers(self):
        """ test_profile.py:TestSendmiPS.test_employers """
        eHome = self.andrewS.eHome_page
        ps_page = self.andrewS.ps_page
        emp_page = self.andrewS.employers_page
        self.assertTrue(self.andrewS.login(self.driver), messages.login)

        self.assertTrue(eHome.on())
        eHome.menu.click_option('settings')

        self.assertTrue(ps_page.on())
        # elements_containing = ps_page.number_of_elements_containing
        # num_employers = elements_containing('a','/settings/employer/','href')
        num_employers = ps_page.num_employers()
        print(num_employers)

        for i in xrange(num_employers):
            business_name = ps_page.employers[i].text
            ps_page.move_to_el(ps_page.employers[i])  #.click()
            self.assertTrue(emp_page.on())
            self.assertFalse(emp_page.has_horizontal_scroll())

            # Check behavior after refresh (no refresh on native)
            if main.is_web():
                self.driver.refresh()
                self.assertTrue(emp_page.on())

            # Check menu (no menu on mobile)
            if main.is_desktop():
                # does not have employer buttons
                self.assertTrue(emp_page.menu.current_business is None)
                self.assertTrue(emp_page.menu.add_button is None)
                self.assertTrue(emp_page.menu.lobby is None)
                self.assertTrue(emp_page.menu.employees is None)
                self.assertTrue(emp_page.menu.pending is None)
                self.assertTrue(emp_page.menu.business_settings is None)
                self.assertTrue(emp_page.menu.admins is None)

                # has employee buttons
                self.assertTrue(emp_page.menu.eHome is not None)
                self.assertTrue(emp_page.menu.recipients is not None)

                # has universal buttons
                self.assertTrue(emp_page.menu.settings is not None)
                self.assertTrue(emp_page.menu.contact_us is not None)
                self.assertTrue(emp_page.menu.about is not None)
                self.assertTrue(emp_page.menu.terms_and_privacy is not None)
                self.assertTrue(emp_page.menu.logout is not None)

            emp_page.header.click_back()
            self.assertTrue(ps_page.on())
Exemple #12
0
    def test_success(self):
        """ test_authentication.py:TestForgotPassword.test_success """
        # assert "Forgot Password" functionality works as expected
        credentials = self.alone1.credentials
        reset_page = self.alone1.reset_password_page
        code_page = self.alone1.reset_password_code_page
        new_page = self.alone1.reset_password_new_page
        eHome = self.alone1.eHome_page
        election_page = self.alone1.pay_election_page
        ps_page = self.alone1.ps_page
        change_pw_page = self.alone1.ps_change_pw_page
        signin_page = self.alone1.signin_page

        # go to reset password page
        if main.is_web():
            reset_page.go()
        else:
            self.assertTrue(signin_page.on())
            signin_page.click_password_reset()
            self.assertTrue(reset_page.on())

        self.assertTrue(reset_page.on())
        reset_page.submit(credentials['email'])
        self.assertTrue(code_page.on())
        code_page.enter_code()
        self.assertTrue(code_page.on())
        code_page.enter_code()

        self.assertTrue(new_page.on())
        new_password = "******"
        new_page.enter_password(new_password)
        #Backend error here, timed out because of it.
        # WebDriverWait(self.driver, 15).until(
        # 	EC.presence_of_element_located((By.ID, 'save_election_button')))

        # Reset password through settings page.
        self.assertTrue(eHome.on('election'))
        eHome.menu.sign_out()

        self.assertTrue(self.alone1.login(self.driver, new_password),
                        messages.login)
        # Currently no election for Stand Alone1, should go to eleciton page.
        self.assertTrue(election_page.on())
        election_page.menu.click_option('settings')
        self.assertTrue(ps_page.on())
        ps_page.change_password()
        self.assertTrue(change_pw_page.on())
        change_pw_page.enter_current_pw(new_password)
        change_pw_page.enter_new_pw(credentials["password"])
        change_pw_page.click_continue()
        self.assertTrue(ps_page.on())
Exemple #13
0
    def test_required_fields(self):
        """ test_authentication.py:TestForgotPassword.test_required_fields """
        # Sometimes creates test-specific sendmi error message. Hits backend weird?
        credentials = self.nicol.credentials
        signin_page = self.nicol.signin_page
        reset_page = self.nicol.reset_password_page
        code_page = self.nicol.reset_password_code_page
        new_page = self.nicol.reset_password_new_page
        lobby_page = self.nicol.lobby_page

        # assert inputs on public 'Reset Password' page are required as expected
        if main.is_web():
            self.assertTrue(reset_page.go())
        else:
            self.assertTrue(signin_page.on())
            signin_page.click_password_reset()
            self.assertTrue(reset_page.on())

        reset_page.submit('')
        tag = 'p'
        error = "Required"
        error_count = reset_page.number_of_elements
        self.assertEqual(1, error_count(tag, error))

        reset_page.submit('*****@*****.**', False)
        # iOS: Sending keys does not remove 'required' error
        if not main.is_ios():
            self.assertEqual(0, error_count(tag, error))

        reset_page.submit(credentials['email'])
        self.assertTrue(code_page.on())
        code_page.enter_code()
        self.assertTrue(code_page.on())
        code_page.enter_code()

        self.assertTrue(new_page.on())
        new_page.click_continue()
        self.assertEqual(1, error_count(tag, error))
        new_page.set_password(credentials['password'])
        # iOS: Sending keys does not remove 'required' error
        if not main.is_ios():
            self.assertEqual(0, error_count(tag, error))
        new_page.click_continue()
        WebDriverWait(
            self.driver, 15).until(lambda x: EC.visibility_of_element_located(
                (By.CLASS_NAME, 'invitations_card'
                 )) or EC.visibility_of_element_located((By.ID, 'cash-bar')))
        #raw_input('page?')
        self.assertTrue(lobby_page.on())
Exemple #14
0
    def test_logout_success(self):
        """ test_authentication.py:TestLogin.test_logout_success """
        # assert menu 'Sign Out' works as expected
        credentials = self.nicol.credentials
        for_employers = self.nicol.for_employers
        signin_page = self.nicol.signin_page
        lobby_page = self.nicol.lobby_page

        self.assertTrue(self.nicol.login(self.driver), messages.login)
        self.assertTrue(lobby_page.on())
        lobby_page.menu.sign_out()
        if main.is_web():
            self.assertTrue(for_employers.on())
        else:
            self.assertTrue(signin_page.on())
Exemple #15
0
    def enter_code(self):
        self.scroll_input_into_view()
        WDW(self.driver,
            10).until(EC.presence_of_element_located((By.ID, 'code')))
        self.code_input.clear()
        self.code_input.send_keys(self.code)
        if main.is_ios():
            self.code_input.click()

        # no continue button on native app
        if main.is_web():
            # Don't try and find primary button: Desktop has signin form
            WDW(self.driver,
                6).until(lambda x: self.is_enabled(self.continue_button))
            self.continue_button.click()
Exemple #16
0
 def enter_code(self):
     self.scroll_to_bottom()
     self.code_input.clear()
     self.code_input.send_keys(self.code)
     if main.is_ios():
         self.code_input.send_keys('')
     # no continue button on native app
     if main.is_web():
         # WDW fails on Safari. Not sure why.
         if main.get_browser() == 'safari':
             time.sleep(1)
         else:
             WDW(self.driver, 10).until(
                 EC.element_to_be_clickable(
                     (By.CLASS_NAME, 'primaryButton')))
         self.continue_button.click()
Exemple #17
0
    def load_recipients(self):
        # Grab recipients and info for their bank accounts
        self.recipUL = self.driver.find_elements_by_class_name('recipAccounts')
        # Should have at least 1. Fail to load page if there aren't any
        fail = self.recipUL[0]

        self.recipients = {}
        try:
            for i, recip in enumerate(self.recipUL):
                name = self.read_recip_name(i)
                bank_accounts = self.recipUL[i].find_elements_by_tag_name('li')
                del bank_accounts[0]  # 1st li is header crap

                # Bank name, account #, clickable element
                accounts = []
                for i, account in enumerate(bank_accounts):
                    divs = bank_accounts[i].find_elements_by_tag_name('div')
                    # Desktop web: divs[1]
                    # Mobile web: divs[0]
                    # Mobile native: ?
                    # for i, div in enumerate(divs):
                    #   print(div.text)

                    if main.is_web():
                        text = divs[0].text
                    else:
                        text = divs[1].text
                    info = self.read_account_info(text)

                    if main.is_ios():
                        info['element'] = divs[0]
                    else:
                        info['element'] = bank_accounts[i]
                    accounts.append(info)
                self.recipients[name] = accounts
        except Exception as ex:
            template = "An exception of type {0} occurred. Arguments:\n{1!r}"
            message = template.format(type(ex).__name__, ex.args)
            raw_input(message)
    def set_input(self, element, value):
        # iOS Native: Click after changing value (otherwise won't recognize new value)

        # Get input/textarea el out of element
        inputEl = self.find_input(element)
        val = inputEl.get_attribute('value')

        # Wait for input to be editable (displayed and enabled)
        if inputEl:
            setValue = False
            count = 0
            while not setValue and count < 5:
                try:
                    if val:
                        self.clear_input(inputEl)

                    inputEl.send_keys(value)
                    if main.is_ios() and not main.is_web():
                        time.sleep(.4)
                        self.click_el(inputEl)
                    if inputEl.get_attribute('value') == value:
                        setValue = True
                    elif inputEl.get_attribute('value') == self.to_phone(
                            value):
                        # Check if input formatted value to phone#
                        setValue = True
                    else:
                        print('SetInput: Expected "' + value + '", loaded "' +
                              str(inputEl.get_attribute('value') + '"'))
                except InvalidElementStateException:
                    print('SetInput: InvalidElementStateException')
                if not setValue:
                    time.sleep(.2)
                    count += 1
        else:
            print('SetInput: Could not find inputEl.')
            raise WebDriverException('SetInput: Could not find inputEl.')
Exemple #19
0
    def test_invalid_credentials(self):
        """ test_authentication.py:TestLogin.test_invalid_credentials """
        # assert 'Sign In' page inputs properly handle invalid credentials
        credentials = self.nicol.credentials
        signin_page = self.nicol.signin_page

        if main.is_web():
            signin_page.go()
        else:
            self.assertTrue(signin_page.on())

        signin_page.submit(credentials['email'], credentials['password'] + '0')
        # self.WDWait.until(EC.presence_of_element_located((By.ID, 'sendmi_error')))
        self.WDWait.until(
            EC.presence_of_element_located((By.CLASS_NAME, 'alert-danger')))
        error = "Incorrect password, email address, or phone number."
        self.assertTrue(error in signin_page.read_error())

        signin_page.submit('abc' + credentials['email'],
                           credentials['password'])
        # self.WDWait.until(EC.presence_of_element_located((By.ID, 'sendmi_error')))
        self.WDWait.until(
            EC.presence_of_element_located((By.CLASS_NAME, 'alert-danger')))
        self.assertTrue(error in signin_page.read_error())
# -test_required_fields
# TestForEmployees - 4
#    -test_about_page
#    -test_contact_us_page
#    -test_for_employees_page
#    -test_for_employees_buttons
# TestForEmployers - 6
#    -test_demo_form
#    -test_for_employers_page
#    -test_invalid_inputs
#    -test_required_fields
#    -test_success_existing
#		 -test_success_new


@unittest.skipIf(not main.is_web() or main.get_priority() < 3, 'Priority')
class TestContactFlow(unittest.TestCase):
    def setUp(self):
        self.driver = browser.start(main.get_env(), main.get_browser())
        self.nicol = profiles.Profile(self.driver, 'nicol')
        self.WDWait = WebDriverWait(self.driver, 10)  #Timeout after 10 sec.

    def tearDown(self):
        self.driver.quit()

    def test_invalid_inputs(self):
        """ test_public.py:TestContactFlow.test_invalid_inputs """
        # assert "Contact Flow" fields correctly handle invalid input
        credentials = self.nicol.credentials
        for_employees = self.nicol.for_employees
        map_page = self.nicol.contact_map_page
class TestEdit(unittest.TestCase):
    def setUp(self):
        self.driver = browser.start(main.get_env(), main.get_browser())
        self.cheeks = profiles.Profile(self.driver, 'cheeks')

    def tearDown(self):
        self.driver.quit()

    # @unittest.skip("Deprecated. Adding from 'send flows' added to bank and atm tests")
    # def test_add_account_redirect(self):
    # 	"""recipients : Edit .                          add_account_redirect"""
    # 	# Adding account from 'send flow' should redirect to send page

    # 	# Yolanda should end test w/ no bank accounts
    # 	eHome = self.cheeks.eHome_page
    # 	recip_page = self.cheeks.recipient_page
    # 	view_page = self.cheeks.recipient_view_page
    # 	ba_page = self.cheeks.bank_account_page
    # 	send_page = self.cheeks.send_page
    # 	sel_page = self.cheeks.bank_account_select_page
    # 	self.assertTrue(self.cheeks.login(self.driver), messages.login)

    # 	self.assertTrue(eHome.on())
    # 	eHome.send_money()

    # 	self.assertTrue(recip_page.on())
    # 	recip_page.click_recipient("Yolanda Castillo", 'edit')

    # 	# edit employee. Should be on default tab (info)
    # 	self.assertTrue(view_page.on())
    # 	self.assertEqual('info', view_page.current_tab())
    # 	view_page.sel_tab('destinations')
    # 	view_page.add_destination()

    # 	self.assertTrue(ba_page.on())
    # 	ba_page.set_destination_type('bank')
    # 	ba_page.set_location('us')
    # 	zions_routing = "124000054"
    # 	acct_number = "123456780001"
    # 	ba_page.set_account_type('savings')
    # 	ba_page.set_routing(zions_routing)
    # 	ba_page.set_account(acct_number)
    # 	ba_page.click_continue()

    # 	# Should be in 'send flow' and redirect to send page
    # 	self.assertTrue(send_page.on())
    # 	send_page.header.click_back()

    # 	self.assertTrue(recip_page.on())
    # 	recip_page.click_recipient("Yolanda Castillo", 'edit')
    # 	# remove Yolanda's bank accounts
    # 	self.assertTrue(view_page.on())
    # 	for i in xrange(view_page.num_accounts()):
    # 		view_page.select_destination('bank', 0)
    # 		self.assertTrue(ba_page.on())
    # 		ba_page.remove()
    # 		self.assertTrue(view_page.on())

    # 	self.assertTrue(view_page.on())
    # 	self.assertEqual(view_page.num_accounts(), 0)

    def test_delete_account(self):
        """ test_recipients.py:TestEdit.test_delete_account """
        # Adding account from 'recipient' page should redirect to view page
        # Yolanda should end test w/ no bank accounts
        eHome = self.cheeks.eHome_page
        recip_page = self.cheeks.recipient_page
        view_page = self.cheeks.recipient_view_page
        ba_page = self.cheeks.bank_account_page
        send_page = self.cheeks.send_page
        sel_page = self.cheeks.bank_account_select_page
        self.assertTrue(self.cheeks.login(self.driver), messages.login)

        self.assertTrue(eHome.on())
        eHome.menu.click_option('recipients')

        self.assertTrue(recip_page.on())
        recip_page.click_recipient("Yolanda Castillo")

        # edit employee. Should be on default tab (info)
        self.assertTrue(view_page.on())
        self.assertEqual('info', view_page.current_tab())
        view_page.add_destination()

        self.assertTrue(ba_page.on())
        ba_page.set_location('us')
        zions_routing = "124000054"
        acct_number = "123456780001"
        ba_page.set_routing(zions_routing)
        ba_page.set_account(acct_number)
        ba_page.set_account_type('savings')
        ba_page.click_continue()

        # Should redirect recipient view page
        self.assertTrue(view_page.on())
        for i in xrange(view_page.num_accounts()):
            view_page.select_destination('bank', 0)
            self.assertTrue(ba_page.on())
            ba_page.remove()
            self.assertTrue(view_page.on())

        self.assertTrue(view_page.on())
        self.assertEqual(view_page.num_accounts(), 0)

    def test_edit_account(self):
        """ test_recipients.py:TestEdit.test_edit_account """
        # dependencies: Recip Roberto Ortega w/ zions bank account
        # 17 digit acct #, checking account.
        eHome = self.cheeks.eHome_page
        recip_page = self.cheeks.recipient_page
        view_page = self.cheeks.recipient_view_page
        ba_page = self.cheeks.bank_account_page
        send_page = self.cheeks.send_page
        sel_page = self.cheeks.bank_account_select_page
        self.assertTrue(self.cheeks.login(self.driver), messages.login)

        self.assertTrue(eHome.on())
        eHome.menu.click_option('recipients')

        self.assertTrue(recip_page.on())
        recip_page.click_recipient("Roberto Ortega")

        # edit employee. Should be on default tab (info)
        self.assertTrue(view_page.on())
        self.assertEqual('info', view_page.current_tab())
        view_page.sel_tab('destinations')
        view_page.select_destination('bank', 0)

        self.assertTrue(ba_page.on())
        ba_page.header.click_back()

        self.assertTrue(view_page.on())
        view_page.select_destination('bank', 0)

        self.assertTrue(ba_page.on())
        zions_routing = "124000054"
        wells_routing = "121042882"
        self.assertEqual(zions_routing,
                         ba_page.routing_number.get_attribute('value'))
        self.assertEqual('checking', ba_page.get_account_type())
        account_number = ba_page.account_number.get_attribute('value')
        acct_num_length = len(account_number)
        self.assertEqual(acct_num_length - 4, account_number.count('X'))
        unredacted = account_number[-4:]
        self.assertEqual(0, unredacted.count('X'))

        ba_page.set_routing(wells_routing)
        self.assertEqual(wells_routing,
                         ba_page.routing_number.get_attribute('value'))
        new_acct_num = self.cheeks.generate_number(3)

        ba_page.set_account(new_acct_num)
        ba_page.set_account_type('savings')
        self.assertEqual('savings', ba_page.get_account_type())
        ba_page.click_continue()

        self.assertTrue(view_page.on())
        view_page.select_destination('bank', 0)

        self.assertTrue(ba_page.on())
        new_acct_num = self.cheeks.generate_number(17)
        ba_page.set_routing(zions_routing)
        ba_page.set_account(new_acct_num)
        ba_page.set_account_type('checking')
        ba_page.click_continue()

        self.assertTrue(view_page.on())
        view_page.header.click_back()

        self.assertTrue(recip_page.on())

    def test_edit_additional_info(self):
        """ test_recipients.py:TestEdit.test_edit_additional_info """
        # Test that editing recipient's additional info persists
        # Dependencies: Roberto Ortega has BBVA cashout
        eHome = self.cheeks.eHome_page
        recip_page = self.cheeks.recipient_page
        view_page = self.cheeks.recipient_view_page
        info_page = self.cheeks.recipient_info_page

        self.assertTrue(self.cheeks.login(self.driver), messages.login)

        self.assertTrue(eHome.on())
        eHome.menu.click_option('recipients')

        self.assertTrue(recip_page.on())
        recip_page.click_recipient("Roberto Ortega")

        self.assertTrue(view_page.on())
        self.assertEqual('info', view_page.current_tab())
        view_page.edit_additional_info()

        # edit existing recipient info
        self.assertTrue(info_page.on())
        initial_info = info_page.addInfo.get_info()

        new_carrier = 'telcel'
        new_phone = self.cheeks.format_phone('202' +
                                             self.cheeks.generate_number(7))
        new_dob = self.cheeks.generate_rfc_dob()

        if initial_info['carrier'] == 'telcel':
            new_carrier = 'at&t'
        while new_phone == initial_info['phone']:
            new_phone = self.cheeks.format_phone(
                '202' + self.cheeks.generate_number(7))
            while new_dob != initial_info['dob']:
                new_dob = self.cheeks.generate_rfc_dob()
        new_info = {
            'carrier': new_carrier,
            'phone': new_phone,
            'dob': new_dob,
        }
        info_page.addInfo.set_info(new_info)
        info_page.addInfo.click_continue()
        self.assertTrue(view_page.on())

        # verify info persisted
        view_page.edit_additional_info()
        self.assertTrue(info_page.on())
        updated_info = info_page.addInfo.get_info()
        self.assertEqual(new_info['carrier'], updated_info['carrier'])
        self.assertEqual(new_info['phone'], updated_info['phone'])
        self.assertEqual(new_info['dob'], updated_info['dob'])

    def test_edit_address(self):
        """ test_recipients.py:TestEdit.test_edit_address """
        # dependencies: Roberto Ortega starts w/ cur_address
        eHome = self.cheeks.eHome_page
        recip_page = self.cheeks.recipient_page
        view_page = self.cheeks.recipient_view_page
        address_page = self.cheeks.recipient_address_page
        self.assertTrue(self.cheeks.login(self.driver), messages.login)

        self.assertTrue(eHome.on())
        eHome.menu.click_option('recipients')

        self.assertTrue(recip_page.on())
        recip_page.click_recipient("Roberto Ortega")

        self.assertTrue(view_page.on())
        self.assertEqual('info', view_page.current_tab())
        view_page.edit_address()

        self.assertTrue(address_page.on())
        address_page.header.click_back()

        self.assertTrue(view_page.on())
        view_page.edit_address()
        # ios is a pain. Only set states that are visible when state dd opens
        cur_address = [
            "101 Main Street", "Col. Atlatilco", "Cancun", "Sonora", "02383"
        ]
        new_address = [
            "2005 State Street", "Centro", "Mexico City", "Quintana Roo",
            "06543"
        ]
        self.assertTrue(address_page.on())
        # if this fails, reset address to cur_address
        # Todo: fix test so it doesn't matter what initial address is
        self.assertEqual(cur_address, address_page.get_address())
        address_page.set_address(new_address, dest_page='recipient_view')

        self.assertTrue(view_page.on())
        view_page.edit_address()

        self.assertTrue(address_page.on())
        self.assertEqual(new_address, address_page.get_address())
        address_page.set_address(cur_address, dest_page='recipient_view')

        self.assertTrue(view_page.on())
        view_page.header.click_back()

        self.assertTrue(recip_page.on())

    # def test_edit_cashout_mx(self):
    # 	"""recipients : Edit .                               edit_cashout_mx"""
    # 	# Create/Edit/Delete cashout location for MX based recipient
    # 	# Cannot edit right now, only delete. Tested in test_add_new_mx_cash
    # 	pass

    # def test_edit_cashout_us(self):
    # 	"""recipients : Edit .                               edit_cashout_us"""
    # 	# Create/Edit/Delete cashout location for US based recipient
    # 	# Cannot edit right now, only delete. Tested in test_add_new_us_cash
    # 	pass

    def test_edit_name(self):
        """ test_recipients.py:TestEdit.test_edit_name """
        # dependencies: recipient Roberto Ortega
        eHome = self.cheeks.eHome_page
        recip_page = self.cheeks.recipient_page
        view_page = self.cheeks.recipient_view_page
        name_page = self.cheeks.recipient_name_page
        self.assertTrue(self.cheeks.login(self.driver), messages.login)

        self.assertTrue(eHome.on())
        eHome.menu.click_option('recipients')

        self.assertTrue(recip_page.on())
        recip_page.click_recipient("Roberto Ortega")

        self.assertTrue(view_page.on())
        self.assertEqual('info', view_page.current_tab())
        view_page.edit_name()

        self.assertTrue(name_page.on())
        name_page.header.click_back()

        self.assertTrue(view_page.on())
        view_page.edit_name()

        self.assertTrue(name_page.on())
        name = ["Roberto", "Ortega", ""]
        new_name = ["Romero", "Garcia", "Lopez"]
        name_page.enter_name(new_name)

        self.assertTrue(view_page.on())
        view_page.header.click_back()

        self.assertTrue(recip_page.on())
        recip_page.click_recipient("Romero Garcia Lopez")

        self.assertTrue(view_page.on())
        view_page.edit_name()

        self.assertTrue(name_page.on())
        name_page.enter_name(name)

        self.assertTrue(view_page.on())
        view_page.header.click_back()

        self.assertTrue(recip_page.on())
        recip_page.click_recipient("Roberto Ortega")
        self.assertTrue(view_page.on())

    @unittest.skipIf(not main.is_web(), "No urls on native")
    def test_try_access_address(self):
        """ test_recipients.py:TestEdit.test_try_access_address """
        # asserting can access address page by url
        eHome = self.cheeks.eHome_page
        recip_page = self.cheeks.recipient_page
        view_page = self.cheeks.recipient_view_page
        address_page = self.cheeks.recipient_address_page
        self.assertTrue(self.cheeks.login(self.driver), messages.login)

        self.assertTrue(eHome.on())
        eHome.menu.click_option('recipients')

        self.assertTrue(recip_page.on())
        recip_page.click_recipient("Miguel Castillo")

        self.assertTrue(view_page.on())
        view_page.go_to_address()
        self.assertTrue(address_page.on())
Exemple #22
0
 def load_continue(self):
     # native has no continue button
     if main.is_web():
         return self.form.find_element_by_class_name('primaryButton')
     return None
Exemple #23
0
 def load_checkbox(self):
     # No remmeber checkbox on native
     if main.is_web():
         return self.form.find_element_by_id('trust30')
     else:
         return None
Exemple #24
0
class TestLogin(unittest.TestCase):
    def setUp(self):
        self.driver = browser.start(main.get_env(), main.get_browser())
        self.nicol = profiles.Profile(self.driver, 'nicol')
        self.WDWait = WebDriverWait(self.driver, 15)

    def tearDown(self):
        self.driver.quit()

    @unittest.skipIf(not main.is_web() or main.is_desktop()
                     or main.get_priority() < 2,
                     'Only get action menu on mobile web')
    def test_action_success(self):
        """ test_authentication.py:TestLogin.test_action_success """
        # assert user can login through action menu
        credentials = self.nicol.credentials
        for_employers = self.nicol.for_employers
        signin_page = self.nicol.signin_page
        signin_code_page = self.nicol.signin_code_page
        lobby_page = self.nicol.lobby_page

        for_employers.go()
        self.assertTrue(for_employers.on())
        for_employers.header.select_action('Sign In')

        self.assertTrue(signin_page.on())
        signin_page.submit(credentials['email'], credentials['password'])

        if signin_code_page.on():  # remember user?
            signin_code_page.enter_code()

        self.assertTrue(lobby_page.on())

    @unittest.skipIf(not main.is_desktop() or main.get_priority() < 2,
                     'Signin dropdown only on desktop')
    def test_dropdown_success(self):
        """ test_authentication.py:TestLogin.test_dropdown_success """
        # assert can login through signin dropdown
        credentials = self.nicol.credentials
        for_employers = self.nicol.for_employers
        signin_code_page = self.nicol.signin_code_page
        lobby_page = self.nicol.lobby_page

        for_employers.go()
        self.assertTrue(for_employers.on())
        for_employers.header.sign_in_submit(credentials['email'],
                                            credentials['password'])

        self.assertTrue(signin_code_page.on())
        signin_code_page.enter_code()

        if signin_code_page.on():  # remember user?
            self.assertTrue(signin_code_page.enter_code())

        self.assertTrue(lobby_page.on())

    @unittest.skipIf(main.get_priority() < 3, "Priority = 3")
    def test_invalid_credentials(self):
        """ test_authentication.py:TestLogin.test_invalid_credentials """
        # assert 'Sign In' page inputs properly handle invalid credentials
        credentials = self.nicol.credentials
        signin_page = self.nicol.signin_page

        if main.is_web():
            signin_page.go()
        else:
            self.assertTrue(signin_page.on())

        signin_page.submit(credentials['email'], credentials['password'] + '0')
        # self.WDWait.until(EC.presence_of_element_located((By.ID, 'sendmi_error')))
        self.WDWait.until(
            EC.presence_of_element_located((By.CLASS_NAME, 'alert-danger')))
        error = "Incorrect password, email address, or phone number."
        self.assertTrue(error in signin_page.read_error())

        signin_page.submit('abc' + credentials['email'],
                           credentials['password'])
        # self.WDWait.until(EC.presence_of_element_located((By.ID, 'sendmi_error')))
        self.WDWait.until(
            EC.presence_of_element_located((By.CLASS_NAME, 'alert-danger')))
        self.assertTrue(error in signin_page.read_error())

    @unittest.skipIf(main.get_priority() < 3, "Priority = 3")
    def test_invalid_inputs(self):
        """ test_authentication.py:TestLogin.test_invalid_inputs """
        # Running this test > once might put your computer out of commission for
        # 15 minutes because it thinks you're trying to hack into accounts

        # assert 'Sign In' page handles invalid input as expected
        credentials = self.nicol.credentials
        signin_page = self.nicol.signin_page

        if not main.is_web():
            self.assertTrue(signin_page.on())
        else:
            signin_page.go()
        # signin_page.set_password(credentials['password'])
        signin_page.submit('', credentials['password'], False)
        invalid_emails = ['invalid', 'invalid@', 'invalid.com']

        containers = ["div", "p", "div"]
        # errors = ["Incorrect password, email address, or phone number.",
        # 	"Please enter a valid email address, mobile phone number, or username.",
        # 	"Incorrect password, email address, or phone number."
        # ]
        error = "Please enter a valid email address."
        # errors = ["Incorrect password, email address, or phone number.",
        # 	"Please enter a valid email address.",
        # 	"Incorrect password, email address, or phone number."
        # ]
        for i, email in enumerate(invalid_emails):
            signin_page.submit(invalid_emails[i], credentials['password'])
            signin_page.check_captcha()

            # Wait for errors to show up
            if i == 1:  # email input error
                # Validation changed on form at some point 4/10/2018
                # Fails to submit, but no error.
                pass
                # print('i: ' + str(i))
                # self.WDWait.until(
                # 	EC.text_to_be_present_in_element((By.ID, 'signin_form_user_helper'),
                # 		errors[i]))
            else:  # form error
                print('i= ' + str(i))
                # self.WDWait.until(
                # EC.text_to_be_present_in_element((By.ID, 'sendmi_error'), error))
                self.WDWait.until(
                    EC.presence_of_element_located(
                        (By.CLASS_NAME, 'alert-danger')))

                self.assertEqual(1,
                                 signin_page.number_of_elements('span', error))

        invalid_phones = ['1234567890', '801123456']
        for phone in invalid_phones:
            error = "Please enter a valid email address, mobile phone number, or username."

            signin_page.submit(phone, credentials['password'])

            # Validation changed on form at some point 4/10/2018
            # Fails to submit, but no error.
            # self.WDWait.until(
            # 	EC.text_to_be_present_in_element((By.ID, 'signin_form_user_helper'),
            # 		error))

            # self.assertEqual(1, signin_page.number_of_elements('p', error))

    @unittest.skipIf(main.get_priority() < 2, "Priority = 2")
    def test_logout_success(self):
        """ test_authentication.py:TestLogin.test_logout_success """
        # assert menu 'Sign Out' works as expected
        credentials = self.nicol.credentials
        for_employers = self.nicol.for_employers
        signin_page = self.nicol.signin_page
        lobby_page = self.nicol.lobby_page

        self.assertTrue(self.nicol.login(self.driver), messages.login)
        self.assertTrue(lobby_page.on())
        lobby_page.menu.sign_out()
        if main.is_web():
            self.assertTrue(for_employers.on())
        else:
            self.assertTrue(signin_page.on())

    @unittest.skipIf(main.is_web() or main.get_priority() < 2,
                     'Test for native only')
    def test_native_signin_success(self):
        """ test_authentication.py:TestLogin.test_native_signin_success """
        credentials = self.nicol.credentials
        signin_page = self.nicol.signin_page
        signin_code_page = self.nicol.signin_code_page

        self.assertTrue(signin_page.on())
        signin_page.submit(credentials['email'], credentials['password'])

        self.assertTrue(signin_code_page.on())
        signin_code_page.enter_code()

    # Form validation changed at some point and none of these errors show up anymore
    @unittest.skip("Validation removed on signin form")
    def test_required_fields(self):
        """ test_authentication.py:TestLogin.test_required_fields """
        # assert 'Sign In' page inputs are required as expected
        credentials = self.nicol.credentials
        signin_page = self.nicol.signin_page

        if not main.is_web():
            self.assertTrue(signin_page.on())
        else:
            signin_page.go()
        signin_page.click_login()

        error = 'Required'
        num_errors = 2
        self.WDWait.until(
            EC.text_to_be_present_in_element(
                (By.ID, 'signin_form_user_helper'), error))
        self.assertEqual(2, signin_page.number_of_elements('p', error))

        # ios can't tell that email was updated so there's still 2 errors
        if not main.is_ios():
            signin_page.set_email(credentials['email'])
            self.WDWait.until(
                EC.text_to_be_present_in_element(
                    (By.ID, 'signin_form_pw_helper'), error))
            num_errors = 1
            self.assertEqual(1, signin_page.number_of_elements('p', error))
            signin_page.set_password(credentials['password'])

            self.assertEqual(0, signin_page.number_of_elements('p', error))

    @unittest.skipIf(not main.is_web() or main.get_priority() < 2,
                     'Test for web only')
    def test_signin_success(self):
        """ test_authentication.py:TestLogin.test_signin_success """
        # assert can login through footer 'Sign In' link
        credentials = self.nicol.credentials
        for_employers = self.nicol.for_employers
        signin_page = self.nicol.signin_page
        signin_code_page = self.nicol.signin_code_page
        lobby_page = self.nicol.lobby_page

        for_employers.go()
        self.assertTrue(for_employers.on())  #scrollTo element.
        for_employers.footer.click_link('sign in')

        self.assertTrue(signin_page.on())
        self.assertTrue(signin_page.is_public())
        signin_page.submit(credentials['email'], credentials['password'])

        self.assertTrue(signin_code_page.on())
        self.assertTrue(signin_code_page.is_public())
        signin_code_page.enter_code()
Exemple #25
0
 def click_remember(self):
     if main.is_web():
         self.move_to_el(self.remember_checkbox)
         time.sleep(.2)
    def login(self, driver, password=None, email=None):
        # Wingcash captcha stuff on Sign In page seems busted. Doesn't let you load it.
        # Go to home page first instead of directly to Sign In
        # Enter credentials
        if password is None:
            password = self.credentials['password']
        if email is None:
            email = self.credentials['email']

        if main.is_web() and self.for_employers.go():
            self.for_employers.header.sign_in_submit(email, password)
        elif self.signin_page.on():
            self.signin_page.submit(email, password)
        else:
            # Couldn't loading signin page
            raise Exception(messages.login_signin)

        # Wait for Sign In Screen to disappear
        try:
            WDW(self.driver, 5).until_not(
                EC.presence_of_element_located((By.ID, 'signin_form_user')))
        except TimeoutException:
            # Something went wrong on Sign In page
            print('Login: Never left Sign In page')

            print('Login: Looking for Sign In error')
            try:
                WDW(driver, 4).until(
                    EC.presence_of_element_located((By.ID, 'sendmi_error')))
                error = self.driver.find_element_by_id('sendmi_error')
                # probably has password error
                print(error.text)
                print(messages.login_error)
                raise Exception(messages.login_error)
            except (TimeoutException, NoSuchElementException) as e:
                # No password error.
                # Captcha checkbox from too many failed login attempts?
                print('Login: No Sign In error. Checking for captcha')
                if self.signin_page.check_captcha():
                    print('Login: Found and handled captcha')
                    # had too many failed login attempts. Should be on code page now
                    # WDW(self.driver, 10).until(lambda x: self.signin_code_page.load())
                    # self.signin_code_page.enter_code()
                else:
                    # No captcha checkbox. Check if user was remembered and code page was skipped
                    try:
                        WDW(driver, 8).until(
                            EC.presence_of_element_located(
                                (By.ID, 'sendmi_appbar')))
                    except TimeoutException:
                        # Couldn't find header. White screen?
                        raise TimeoutException("Login: Whitescreen?")

        # try and load signin confirmation page. Enter code if page loads
        check_for_error = False
        try:
            WDW(self.driver, 10).until(lambda x: self.signin_code_page.load())
            self.signin_code_page.enter_code()
        except TimeoutException:
            # signin confirmation didn't load
            check_for_error = True

        # Signin Code page didn't load. Wrong password?
        # if check_for_error:
        #   try:
        #     WDW(driver, 4).until(
        #       EC.presence_of_element_located((By.ID, 'sendmi_error')))
        #     error = self.driver.find_element_by_id('sendmi_error')
        #     # probably has password error
        #     print(error.text)
        #     print(messages.login_error)
        #     raise Exception(messages.login_error)
        #   except (TimeoutException, NoSuchElementException) as e:
        #     # No password error.
        #     # Captcha checkbox from too many failed login attempts?
        #     if self.signin_page.check_captcha():
        #       # had too many failed login attempts. Should be on code page now
        #       WDW(self.driver, 10).until(lambda x: self.signin_code_page.load())
        #       self.signin_code_page.enter_code()
        #     else:
        #       # No captcha checkbox. Check if user was remembered and code page was skipped
        #       try:
        #         WDW(driver, 8).until(
        #           EC.presence_of_element_located((By.ID, 'sendmi_appbar')))
        #       except TimeoutException:
        #         # Couldn't find header. White screen?
        #         raise TimeoutException("Login: Whitescreen?")

        # Should be logged in. Wait for an authenticated page to load
        try:
            WDW(driver, 15).until(lambda x: self.lobby_page.load() or self.
                                  eHome_page.load('login'))
            #extended because slow-as-frozen-mud Android emulator
            #pay-election page included for accounts that have not set an election.
            return True
        except TimeoutException:
            raise TimeoutException(messages.login_landing_exception)
        except Exception as e:
            msg = "Login: Unexpected error:", sys.exc_info()[0]
            print(msg)
            raise Exception(msg)
        return False
Exemple #27
0
    def test_single_election(self):
        """ test_profile.py:TestElection.test_single_election """
        # process all pending elections for Multiverse
        # Lili needs to be employee of 'Multiverse' w/ emp ID 13313113
        business = 'Multiverse'
        lobby_page = self.nicol.lobby_page
        pe_page = self.nicol.pending_elections_page
        self.assertTrue(self.nicol.login(self.driver), messages.login)
        self.assertTrue(lobby_page.on())
        # Can't close menu on Android. Checking for business leaves menu open
        if not main.is_android():
            if lobby_page.menu.get_current_business() != business:
                lobby_page.menu.select_business(business)
                self.assertTrue(lobby_page.on())
        lobby_page.click_link('card', 1)
        self.assertTrue(pe_page.on())
        if pe_page.num_pending_elections() > 0:
            pe_page.mark_all_as_processed()
        pe_page.menu.sign_out()

        # lili: request new Multiverse election
        eHome = self.lili.eHome_page
        election_page = self.lili.pay_election_page
        history_page = self.lili.election_history_page
        self.assertTrue(self.lili.login(self.driver), messages.login)

        self.assertTrue(eHome.on())
        eHome.setTab('election')
        elections = eHome.get_elections()
        initial_election = elections[business]
        print(initial_election)
        # Lili should have single election field (no total)
        self.assertEqual(None, elections['total'])

        increase = self.lili.generate_amount()
        new_election = str(Decimal(initial_election) + Decimal(increase))
        print(new_election)

        eHome.set_election(business, new_election)
        new_elections = eHome.get_elections()
        self.assertEqual(new_election, new_elections[business])
        self.assertEqual(None, new_elections['total'])
        eHome.click_save_elections()
        self.assertTrue(eHome.on('election'))
        self.assertTrue(eHome.has_election_prompt())
        self.assertFalse(eHome.has_save_election_button())
        # eHome.clear_election_prompt()
        # self.assertFalse(eHome.has_election_prompt())
        # self.assertTrue(eHome.has_save_election_button())

        # assert change is reflected in lili's election history
        eHome.view_election_history()
        self.assertTrue(history_page.on())
        election = history_page.get_election()
        self.assertTrue(election['name'] == business)
        self.assertTrue(election['amount'] == new_election)
        history_page.header.click_back()

        # election should be pending
        self.assertTrue(eHome.on('election'))
        pending_elections = eHome.get_elections()
        self.assertTrue(pending_elections[business + " pending"])
        eHome.menu.sign_out()

        # assert change is NOT reflected in Multiverse employee table
        emp_page = self.nicol.employee_page
        view_page = self.nicol.employee_view_page
        self.assertTrue(self.nicol.login(self.driver), messages.login)
        self.assertTrue(lobby_page.on())
        lobby_page.menu.click_option('employees')

        self.assertTrue(emp_page.on())
        lili = emp_page.get_employee('id', '13313113')
        # should still be initial election
        # can fail if multiple elections have been requested w/out being processed.
        self.assertEqual(lili['election'], initial_election + " USD")
        self.assertNotEqual(lili['election'], new_election + " USD")

        self.assertTrue(emp_page.click_employee('id', '13313113'))
        self.assertTrue(view_page.on())
        self.assertEqual(view_page.election.text, initial_election + " USD")
        self.assertNotEqual(view_page.election.text, new_election + " USD")
        view_page.header.click_back()
        self.assertTrue(emp_page.on())

        # process pending election and recheck employee table
        emp_page.menu.click_option('pending elections')
        self.assertTrue(pe_page.on())
        pe_page.mark_all_as_processed()
        pe_page.menu.click_option('employees')
        self.assertTrue(emp_page.on())

        lili = emp_page.get_employee('id', '13313113')

        # Doesn't always refresh quickly.
        # Force refresh if they're not equal right away
        if new_election + ' USD' == lili['election']:
            self.assertEqual('Active', lili['status'])
            self.assertEqual(new_election + ' USD', lili['election'])
        else:
            # Refresh and check again
            self.driver.refresh()
            self.assertTrue(emp_page.on())
            lili = emp_page.get_employee('id', '13313113')
            self.assertEqual('Active', lili['status'])
            self.assertEqual(new_election + ' USD', lili['election'])
        emp_page.menu.sign_out()

        # lili's election should not be pending
        self.assertTrue(self.lili.login(self.driver), messages.login)
        # not sure why this is different on native. I'm assuming app remembers which tab you were on
        if not main.is_web():
            self.assertTrue(eHome.on('election'))
        else:
            self.assertTrue(eHome.on())
            eHome.setTab('election')
        elections = eHome.get_elections()
        self.assertFalse(elections[business + ' pending'])