tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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)