test_1570108_steamcommunity.py (3973B)
1 import pytest 2 3 URL = "https://steamcommunity.com/chat" 4 5 6 USERID_CSS = "[data-featuretarget=login] input[type=text]" 7 PASSWORD_CSS = "[data-featuretarget=login] input[type=password]" 8 SIGNIN_CSS = "[data-featuretarget=login] button[type=submit]" 9 GEAR_CSS = ".friendListButton" 10 LOGIN_FAIL_TEXT = "Please check your password and account name and try again." 11 AUTH_CSS = "[data-featuretarget=login] input.Focusable" 12 AUTH_DIGITS_CSS = "[data-featuretarget=login] input.Focusable" 13 AUTH_RETRY_TEXT = "Incorrect code, please try again" 14 AUTH_RETRY_LOADER_CSS = "[data-featuretarget=login] div:has(+ input.Focusable)" 15 AUTH_RETRY_EXPIRED_TEXT = "Expired" 16 RATE_TEXT = "Too Many Retries" 17 VOICE_XPATH = "//*[contains(text(), 'Voice')]" 18 MIC_BUTTON_CSS = "button.LocalMicTestButton" 19 UNSUPPORTED_TEXT = "currently unsupported in Firefox" 20 21 22 async def do_2fa(client): 23 digits = client.await_css(AUTH_DIGITS_CSS, all=True) 24 assert len(digits) > 0 25 26 loader = client.css(AUTH_RETRY_LOADER_CSS) 27 if client.find_element(loader): 28 client.await_element_hidden(loader) 29 30 for digit in digits: 31 if digit.property("value"): 32 digit.send_keys("\ue003") # backspace 33 34 code = input("**** Enter two-factor authentication code: ") 35 for i, digit in enumerate(code): 36 if len(digits) > i: 37 digits[i].send_keys(digit) 38 39 client.await_element(loader, timeout=10) 40 client.await_element_hidden(loader) 41 42 43 async def load_mic_test(client, credentials, should_do_2fa): 44 await client.navigate(URL) 45 46 async def login(): 47 userid = client.await_css(USERID_CSS) 48 password = client.find_css(PASSWORD_CSS) 49 submit = client.find_css(SIGNIN_CSS) 50 assert client.is_displayed(userid) 51 assert client.is_displayed(password) 52 assert client.is_displayed(submit) 53 54 userid.send_keys(credentials["username"]) 55 password.send_keys(credentials["password"]) 56 submit.click() 57 58 await login() 59 60 while True: 61 auth, retry, gear, fail, rate = client.await_first_element_of( 62 [ 63 client.css(AUTH_CSS), 64 client.text(AUTH_RETRY_TEXT), 65 client.css(GEAR_CSS), 66 client.text(LOGIN_FAIL_TEXT), 67 client.text(RATE_TEXT), 68 ], 69 is_displayed=True, 70 timeout=20, 71 ) 72 73 if retry: 74 await do_2fa(client) 75 continue 76 77 if rate: 78 pytest.skip( 79 "Too many Steam login attempts in a short time; try again later." 80 ) 81 return None 82 elif auth: 83 if should_do_2fa: 84 await do_2fa(client) 85 continue 86 87 pytest.skip( 88 "Two-factor authentication requested; disable Steam Guard" 89 " or run this test with --do2fa to live-input codes" 90 ) 91 return None 92 elif fail: 93 pytest.skip("Invalid login provided.") 94 return None 95 else: 96 break 97 98 assert gear 99 gear.click() 100 101 voice = client.await_xpath(VOICE_XPATH, is_displayed=True) 102 voice.click() 103 104 mic_test = client.await_css(MIC_BUTTON_CSS, is_displayed=True) 105 return mic_test 106 107 108 @pytest.mark.skip_platforms("android") 109 @pytest.mark.asyncio 110 @pytest.mark.with_interventions 111 async def test_enabled(client, credentials, should_do_2fa): 112 mic_test = await load_mic_test(client, credentials, should_do_2fa) 113 if not mic_test: 114 return 115 116 with client.assert_getUserMedia_called(): 117 mic_test.click() 118 119 assert not client.find_text(UNSUPPORTED_TEXT) 120 121 122 @pytest.mark.skip_platforms("android") 123 @pytest.mark.asyncio 124 @pytest.mark.without_interventions 125 async def test_disabled(client, credentials, should_do_2fa): 126 mic_test = await load_mic_test(client, credentials, should_do_2fa) 127 if not mic_test: 128 return 129 130 mic_test.click() 131 132 assert client.await_text(UNSUPPORTED_TEXT, is_displayed=True)