Test Results (7 tests)
⏱️ Duration: 28.14s
❌ Error:
mobile_page = <Page url='https://test03.testingpromo.com/planner/my-calendar'>
base_url = 'https://test03.testingpromo.com'
@pytest.mark.skip_prod
def test_m02_basic_actions_mobile_user(mobile_page: Page, base_url: str) -> None:
"""M02: Hamburger nav to Planner PromoAI → pricing → signup → purchase plan → delete user."""
mobile_page.goto(base_url)
mobile_page.wait_for_load_state("domcontentloaded")
_dismiss_cookies(mobile_page)
# Open sidebar and navigate to Planner PromoAI
mobile_page.locator('span.sidebar__icon').wait_for(state="visible", timeout=15_000)
mobile_page.locator('span.sidebar__icon').click()
mobile_page.locator('a.sidebar__link.promoai').wait_for(state="visible", timeout=10_000)
mobile_page.locator('a.sidebar__link.promoai').click()
> mobile_page.locator('span.calendar-header__nav-date').wait_for(state="visible", timeout=20_000)
tests/test_mobile_view.py:93:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/local/lib/python3.10/dist-packages/playwright/sync_api/_generated.py:20539: in wait_for
self._sync(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_locator.py:748: in wait_for
await self._frame.wait_for_selector(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_frame.py:394: in wait_for_selector
await self._channel.send(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_connection.py:76: in send
return await self._connection.wrap_api_call(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <playwright._impl._connection.Connection object at 0x7f140e65c4f0>
cb = <function Channel.send.<locals>.<lambda> at 0x7f140db82950>
is_internal = False, title = None
async def wrap_api_call(
self, cb: Callable[[], Any], is_internal: bool = False, title: str = None
) -> Any:
if self._api_zone.get():
return await cb()
⏱️ Duration: 29.26s
❌ Error:
mobile_page = <Page url='https://test03.testingpromo.com/planner/promoai?term=promoai.io&detect=true&utm_content=home_page_generate&generation_source=Homepage'>
base_url = 'https://test03.testingpromo.com'
@pytest.mark.skip_prod
def test_m04_new_user_generates_ai_posts_mobile(mobile_page: Page, base_url: str) -> None:
"""M04: Homepage AI input → set 14 posts × 2 batches → signup → skip tutorial → planner."""
main = MainPage(mobile_page)
signup = SignUpPage(mobile_page)
auto = AutopilotPage(mobile_page)
# ---- Batch 1: provide URL, set 14 posts, sign up, skip tutorial ----
main.go_to_homepage_with_tid(base_url, "200220240")
_dismiss_cookies(mobile_page)
main.provide_autopilot_input(sample_ai_website)
# Post-count wizard appears
> auto.click_generate_ai_posts_button()
tests/test_mobile_view.py:229:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/autopilot_page.py:1196: in click_generate_ai_posts_button
btn.click()
/usr/local/lib/python3.10/dist-packages/playwright/sync_api/_generated.py:17876: in click
self._sync(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_locator.py:165: in click
return await self._frame._click(self._selector, strict=True, **params)
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_frame.py:593: in _click
await self._channel.send("click", self._timeout, locals_to_params(locals()))
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_connection.py:76: in send
return await self._connection.wrap_api_call(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <playwright._impl._connection.Connection object at 0x7f140e65c4f0>
cb = <function Channel.send.<locals>.<lambda> at 0x7f140d617880>
is_internal = False, title = None
async def wrap_api_call(
self, cb: Callable[[], Any], is_internal: bool = False, title: str = None
)
⏱️ Duration: 17.70s
❌ Error:
mobile_page = <Page url='https://test03.testingpromo.com/signup'>
base_url = 'https://test03.testingpromo.com'
def test_m05_generate_single_ai_post_mobile(mobile_page: Page, base_url: str) -> None:
"""M05: Verify mobile single AI post button for unauthenticated user (Sign up prompt),
then sign up and generate a single AI post.
"""
auto = AutopilotPage(mobile_page)
signup = SignUpPage(mobile_page)
# Part 1: verify mobile AI button prompts signup for unauthenticated user
auto.go_to_my_calendar(base_url)
mobile_page.wait_for_load_state("domcontentloaded")
_dismiss_cookies(mobile_page)
mobile_page.locator('[data-qaid="new-video-mobile-button"]').wait_for(
state="visible", timeout=15_000
)
mobile_page.locator('[data-qaid="new-video-mobile-button"]').click()
# Unauthenticated users see a Sign up CTA
mobile_page.locator('button:has-text("Sign up")').wait_for(state="visible", timeout=10_000)
# Part 2: sign up via standard /signup page
email = random_email()
> signup.create_account(base_url, email, fullname, random_password)
tests/test_mobile_view.py:304:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <pages.sign_up_page.SignUpPage object at 0x7f140d8d5690>
base_url = 'https://test03.testingpromo.com'
email = 'promo.auto.6d0c8928f2@gmail.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
⏱️ Duration: 30.50s
❌ Error:
mobile_page = <Page url='https://test03.testingpromo.com/login'>
base_url = 'https://test03.testingpromo.com'
def test_im03_image_resizer_mobile_logged_in(mobile_page: Page, base_url: str) -> None:
"""IM03: Login on mobile, go to image resizer, upload image, select Facebook, download."""
login_page = LoginPage(mobile_page)
ir = ImageResizerPage(mobile_page)
> login_page.login_directly(base_url, general_mail(), get_password())
tests/test_mobile_view.py:377:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/login_page.py:116: in login_directly
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._impl._connection.Connection object at 0x7f140e65c4f0>
cb = <function Channel.send.<locals>.<lambda> at 0x7f140d5ef7f0>
is_internal = False, title = None
async def wrap_api_call(
self, cb: Callable[[], Any], is_internal: bool = False, title: str = None
) -> Any:
if self._api_zone.get():
return await cb()
task = asyncio.current_task(self._loop)
parsed_st = _attach_api_call_information(
getattr(task, "__pw_stack__", None) or _capture_stack_trace(),
is_internal,
title,
)
self._api_zone.set(parsed_st)
try:
return await cb(