Test Results (7 tests)
⏱️ Duration: 28.07s
❌ 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 0x7f1cbf4b4520>
cb = <function Channel.send.<locals>.<lambda> at 0x7f1cbe9d2950>
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.20s
❌ 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 0x7f1cbf4b4520>
cb = <function Channel.send.<locals>.<lambda> at 0x7f1cbd863a30>
is_internal = False, title = None
async def wrap_api_call(
self, cb: Callable[[], Any], is_internal: bool = False, title: str = None
)
⏱️ Duration: 30.01s
❌ Error:
mobile_page = <Page url='about:blank'>
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)
tests/test_mobile_view.py:290:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/autopilot_page.py:397: in go_to_my_calendar
self.page.goto(f"{base_url}{self.PLANNER_MY_CALENDAR_PATH}")
/usr/local/lib/python3.10/dist-packages/playwright/sync_api/_generated.py:9875: in goto
self._sync(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_page.py:560: in goto
return await self._main_frame.goto(**locals_to_params(locals()))
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_frame.py:156: in goto
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 0x7f1cbf4b4520>
cb = <function Channel.send.<locals>.<lambda> at 0x7f1cbd8312d0>
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:
⏱️ Duration: 30.51s
❌ 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 0x7f1cbf4b4520>
cb = <function Channel.send.<locals>.<lambda> at 0x7f1cbd8313f0>
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(
⏱️ Duration: 21.18s
❌ Error:
mobile_page = <Page url='https://test03.testingpromo.com/tools/image-resizer'>
base_url = 'https://test03.testingpromo.com'
def test_im04_image_resizer_mobile_not_logged_in(mobile_page: Page, base_url: str) -> None:
"""IM04 (smoke): Not logged in, mobile image resizer — upload → select Facebook →
verify Download Selected Images button is present.
Note: Original behaviour (redirect-to-signup on download) no longer occurs — the button
click silently does nothing for unauthenticated mobile users. Pricing / signup is still
accessible via the hamburger 'Pricing' link. Asserting UI presence only.
"""
ir = ImageResizerPage(mobile_page)
> ir.go_to_image_resizer(base_url)
tests/test_mobile_view.py:402:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/image_resizer_page.py:46: in go_to_image_resizer
self.page.locator(self.MAIN_TITLE).wait_for(state="visible", timeout=self.T_SLOW)
/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 0x7f1cbf4b4520>
cb = <function Channel.send.<locals>.<lambda> at 0x7f1cbe935900>
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