⏱️ Duration: 21.46s
❌ Error:
mobile_page = <Page url='https://promo.com/categories/health-and-fitness?funnel=0'>
base_url = 'https://promo.com'
def test_m01_create_video_and_receive_magic_link(mobile_page: Page, base_url: str) -> None:
"""M01: Logged-in mobile user picks a video, uses it, and gets the magic-link confirmation."""
login_page = LoginPage(mobile_page)
login_page.login_directly(base_url, general_mail(), get_password())
mobile_page.goto(base_url)
mobile_page.wait_for_load_state("domcontentloaded")
_dismiss_cookies(mobile_page)
get_started = mobile_page.locator('[data-cta="ai_sub_CTA_1"]').first
get_started.wait_for(state="visible", timeout=15_000)
get_started.click()
> _select_and_use_video(mobile_page)
tests/test_mobile_view.py:182:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/test_mobile_view.py:158: in _select_and_use_video
search_box.wait_for(state="visible", timeout=10_000)
/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 0x7fe8a100c1f0>
cb = <function Channel.send.<locals>.<lambda> at 0x7fe8a05956c0>
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._lo
⏱️ Duration: 149.08s
❌ Error:
mobile_page = <Page url='https://promo.com/planner/my-calendar#ai-generation'>
base_url = 'https://promo.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)
signup.skip_survey()
# Close AI onboarding if the URL input panel is visible
try:
mobile_page.locator(auto.WEBSITE_TOPIC_URL_INPUT).wait_for(state="visible", timeout=8_000)
mobile_page.locator(signup.AI_ONBOARDING_X_BTN).click()
except PlaywrightTimeoutError:
pass
# Part 3: generate a single AI post on mobile (now logged in)
auto.go_to_my_calendar(base_url)
_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(force=True)
# Description input — exact class match to avoid strict-mode collisi