Test Results (6 tests)
⏱️ Duration: 110.38s
❌ Error:
sign_up_page = <pages.sign_up_page.SignUpPage object at 0x7f1164283a00>
pricing_page = <pages.pricing_page.PricingPage object at 0x7f1164283760>
billing_page = <pages.billing_page.BillingPage object at 0x7f1164283010>
base_url = 'https://test03.testingpromo.com'
@pytest.mark.skip_prod
def test_bi03_downgrade_plan_via_change_plan_button(
sign_up_page, pricing_page, billing_page, base_url
):
"""
Bi03 User can downgrade his plan using Change plan button.
Standard Annual user opens Billing, clicks Change Plan, selects Basic
Monthly from the embedded widget, closes the confirmation, and ends up
with a pending downgrade (still on Standard until period end).
"""
email = f"promo.auto.bi03.{uuid.uuid4().hex[:8]}@promo.com"
> _signup_and_purchase_plan(
sign_up_page, pricing_page, base_url, email,
PricingPage.STANDARD_ANNUAL_CTA, monthly=False,
)
tests/billing/test_billing.py:106:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/billing/test_billing.py:59: in _signup_and_purchase_plan
pricing_page.purchase_plan_direct(plan_button_selector, monthly=monthly)
pages/pricing_page.py:179: in purchase_plan_direct
self.page.wait_for_function(
/usr/local/lib/python3.10/dist-packages/playwright/sync_api/_generated.py:12761: in wait_for_function
self._sync(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_page.py:1151: in wait_for_function
return await self._main_frame.wait_for_function(**locals_to_params(locals()))
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_frame.py:940: in wait_for_function
await self._channel.send("waitForFunction", self._timeout, params)
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_connection.py:76: in send
return await self._connection.wrap_api_call(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <playwright
📸 Failure Screenshot:
⏱️ Duration: 15.57s
❌ Error:
sign_up_page = <pages.sign_up_page.SignUpPage object at 0x7f115f750430>
pricing_page = <pages.pricing_page.PricingPage object at 0x7f115f751180>
billing_page = <pages.billing_page.BillingPage object at 0x7f115f7514b0>
base_url = 'https://test03.testingpromo.com'
@pytest.mark.skip_prod
def test_bi04_update_payment_method_and_email(
sign_up_page, pricing_page, billing_page, base_url
):
"""
Bi04 User can update his payment method and email address.
Pro Annual user opens Billing, updates the card to a different valid
test card, updates the billing email, and both changes are reflected.
"""
email = f"promo.auto.bi04.{uuid.uuid4().hex[:8]}@promo.com"
> _signup_and_purchase_plan(
sign_up_page, pricing_page, base_url, email,
PricingPage.PRO_ANNUAL_CTA, monthly=False,
)
tests/billing/test_billing.py:136:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/billing/test_billing.py:44: in _signup_and_purchase_plan
sign_up_page.create_account(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <pages.sign_up_page.SignUpPage object at 0x7f115f750430>
base_url = 'https://test03.testingpromo.com'
email = 'promo.auto.bi04.0e47c01c@promo.com', full_name = 'Automate Promo'
password = '123456789'
def create_account(self, base_url: str, email: str, full_name: str, password: str):
"""
Creates a new account by navigating directly to /signup.
Mirrors: signup_process_steps_email(browser, random_email)
Test environments (testingpromo.com) are behind Cloudflare Access —
CF headers are injected at the browser-context level in conftest.py.
"""
self.page.goto(f"{base_url}/signup")
self.page.locator(self.FULL_NAME_INPUT).wait_for(state="visible", timeout=self.T_SLOW)
# On some test envs the cookie banner overlaps the Sign up but
📸 Failure Screenshot:
⏱️ Duration: 15.53s
❌ Error:
sign_up_page = <pages.sign_up_page.SignUpPage object at 0x7f115ec22680>
pricing_page = <pages.pricing_page.PricingPage object at 0x7f115ec224a0>
billing_page = <pages.billing_page.BillingPage object at 0x7f115ec225c0>
base_url = 'https://test03.testingpromo.com'
@pytest.mark.skip_prod_skip_smoke
def test_bi05_standard_user_redirected_from_upgrade_page(
sign_up_page, pricing_page, billing_page, base_url
):
"""
Bi05 Standard user tries to access upgrade page but is redirected to billing.
A Standard Monthly user (already on the plan the upgrade page sells) is
redirected straight to Billing instead of seeing the upgrade offer.
"""
email = f"promo.auto.bi05.{uuid.uuid4().hex[:8]}@promo.com"
> _signup_and_purchase_plan(
sign_up_page, pricing_page, base_url, email,
PricingPage.STANDARD_MONTHLY_CTA, monthly=True,
)
tests/billing/test_billing.py:165:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/billing/test_billing.py:44: in _signup_and_purchase_plan
sign_up_page.create_account(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <pages.sign_up_page.SignUpPage object at 0x7f115ec22680>
base_url = 'https://test03.testingpromo.com'
email = 'promo.auto.bi05.99427038@promo.com', full_name = 'Automate Promo'
password = '123456789'
def create_account(self, base_url: str, email: str, full_name: str, password: str):
"""
Creates a new account by navigating directly to /signup.
Mirrors: signup_process_steps_email(browser, random_email)
Test environments (testingpromo.com) are behind Cloudflare Access —
CF headers are injected at the browser-context level in conftest.py.
"""
self.page.goto(f"{base_url}/signup")
self.page.locator(self.FULL_NAME_INPUT).wait_for(state="visible", timeout=self.T_SLOW)
# On some test
📸 Failure Screenshot:
⏱️ Duration: 15.60s
❌ Error:
sign_up_page = <pages.sign_up_page.SignUpPage object at 0x7f115f751e40>
pricing_page = <pages.pricing_page.PricingPage object at 0x7f115ec0f970>
billing_page = <pages.billing_page.BillingPage object at 0x7f115ec0fc10>
base_url = 'https://test03.testingpromo.com'
@pytest.mark.skip_prod_skip_smoke
def test_bi06_basic_monthly_upgrades_via_upgrade_page(
sign_up_page, pricing_page, billing_page, base_url
):
"""
Bi06 Basic monthly user upgrades plan to standard via the upgrade page.
"""
email = f"promo.auto.bi06.{uuid.uuid4().hex[:8]}@promo.com"
> _signup_and_purchase_plan(
sign_up_page, pricing_page, base_url, email,
PricingPage.BASIC_MONTHLY_CTA, monthly=True,
)
tests/billing/test_billing.py:186:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/billing/test_billing.py:44: in _signup_and_purchase_plan
sign_up_page.create_account(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <pages.sign_up_page.SignUpPage object at 0x7f115f751e40>
base_url = 'https://test03.testingpromo.com'
email = 'promo.auto.bi06.01dc286e@promo.com', full_name = 'Automate Promo'
password = '123456789'
def create_account(self, base_url: str, email: str, full_name: str, password: str):
"""
Creates a new account by navigating directly to /signup.
Mirrors: signup_process_steps_email(browser, random_email)
Test environments (testingpromo.com) are behind Cloudflare Access —
CF headers are injected at the browser-context level in conftest.py.
"""
self.page.goto(f"{base_url}/signup")
self.page.locator(self.FULL_NAME_INPUT).wait_for(state="visible", timeout=self.T_SLOW)
# On some test envs the cookie banner overlaps the Sign up button and
# silently swallows the click (no navigation, no error) — dismiss it first.
cookies_btn = self.page.lo
📸 Failure Screenshot:
⏱️ Duration: 15.65s
❌ Error:
sign_up_page = <pages.sign_up_page.SignUpPage object at 0x7f115ec219c0>
pricing_page = <pages.pricing_page.PricingPage object at 0x7f115ec21b40>
billing_page = <pages.billing_page.BillingPage object at 0x7f115ec21960>
login_page = <pages.login_page.LoginPage object at 0x7f115eb7e980>
base_url = 'https://test03.testingpromo.com'
@pytest.mark.skip_prod_skip_smoke
def test_bi07_basic_annual_upgrades_via_upgrade_page(
sign_up_page, pricing_page, billing_page, login_page, base_url
):
"""
Bi07 Basic annual user upgrades plan to standard via the upgrade page.
Covers the signed-out edge case: the upgrade page is reachable while
logged out, attempting to upgrade surfaces an inline login form, and
completing login finishes the upgrade.
Scope note: the source scenario also asserts the Monthly/Annual toggle
is hidden on this page (both signed out and signed back in). Verified
empirically (2026-09-13) that the toggle IS visible for a signed-out
visitor on the current product — that assertion no longer reflects
real behavior (the source itself flagged this exact step as
"to_improve... please review" even at the time it was written), so it
was dropped rather than encoding a false expectation.
"""
email = f"promo.auto.bi07.{uuid.uuid4().hex[:8]}@promo.com"
> _signup_and_purchase_plan(
sign_up_page, pricing_page, base_url, email,
PricingPage.BASIC_ANNUAL_CTA, monthly=False,
)
tests/billing/test_billing.py:226:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/billing/test_billing.py:44: in _signup_and_purchase_plan
sign_up_page.create_account(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <pages.sign_up_page.SignUpPage object at 0x7f115ec219c0>
base_url = 'https://test03.testingpromo.com'
email = 'promo.auto.bi07.8821b88
📸 Failure Screenshot: