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))
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')
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'])
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'))
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()
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())
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)
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
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."
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.")
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())
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())
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())
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())
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()
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()
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.')
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())
def load_continue(self): # native has no continue button if main.is_web(): return self.form.find_element_by_class_name('primaryButton') return None
def load_checkbox(self): # No remmeber checkbox on native if main.is_web(): return self.form.find_element_by_id('trust30') else: return None
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()
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
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'])