Phone tests: expired sign-ins, evidence, and probes that only judge what can be tapped
A saved sign-in whose session expired landed on the login page and every route its persona opened timed out; both the desktop and the phone sign-in now see that and sign in afresh. A route that fails to open leaves its screenshot and text, as a failed sign-in does. A target's probes stay inside what its scroller shows (a card half under the feed's top edge was failed for the part out of sight), a failed probe names what it hit, and the element blamed for sideways scroll is never one inside a nested clipping box, which can't widen the page. The desktop guard reads its probe sizes as a list. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LsXgEaXee4GCU1hwYgPJXw
This commit is contained in:
1 parent
63f2517f5b
commit
ffd4acd3d0
4 files changed
+92
-20
No files matched your search
@@ -15,8 +15,12 @@ namespace decePubClient.E2E.Support
|
||||
{
|
||||
var known = await browser.Open(state);
|
||||
await known.Page.GotoAsync(Pasture.Site + "/");
|
||||
await known.Page.Locator("article[data-uri], [data-feed-empty]").First.WaitForAsync(new() { Timeout = 30000 });
|
||||
return known;
|
||||
if (!await Stale(known.Page))
|
||||
{
|
||||
await known.Page.Locator("article[data-uri], [data-feed-empty]").First.WaitForAsync(new() { Timeout = 30000 });
|
||||
return known;
|
||||
}
|
||||
await known.DisposeAsync();
|
||||
}
|
||||
var session = await browser.Open();
|
||||
await Through(session.Page, persona);
|
||||
@@ -34,13 +38,43 @@ namespace decePubClient.E2E.Support
|
||||
await (await As(browser, persona)).DisposeAsync();
|
||||
var session = await browser.Open(state, phone);
|
||||
await session.Page.GotoAsync(Pasture.Site + "/");
|
||||
await session.Page.EvaluateAsync("() => localStorage.removeItem('FeedFilter')");
|
||||
await session.Page.GotoAsync(Pasture.Site + "/");
|
||||
await session.Page.Locator("article[data-uri], [data-feed-empty]").First.WaitForAsync(new() { Timeout = 30000 });
|
||||
if (await Stale(session.Page))
|
||||
{
|
||||
// the saved sign-in has expired (the page went to /login): sign in again on a desktop and start over
|
||||
await session.DisposeAsync();
|
||||
await (await As(browser, persona, fresh: true)).DisposeAsync();
|
||||
session = await browser.Open(state, phone);
|
||||
}
|
||||
try
|
||||
{
|
||||
await session.Page.GotoAsync(Pasture.Site + "/");
|
||||
await session.Page.EvaluateAsync("() => localStorage.removeItem('FeedFilter')");
|
||||
await session.Page.GotoAsync(Pasture.Site + "/");
|
||||
await session.Page.Locator("article[data-uri], [data-feed-empty]").First.WaitForAsync(new() { Timeout = 30000 });
|
||||
}
|
||||
catch
|
||||
{
|
||||
await Evidence(session.Page, $"signin-{phone.Key}-{persona.UserName}");
|
||||
throw;
|
||||
}
|
||||
await session.AssertPhone();
|
||||
return session;
|
||||
}
|
||||
|
||||
static async Task<bool> Stale(IPage page)
|
||||
{
|
||||
var until = DateTime.UtcNow.AddSeconds(15);
|
||||
while (DateTime.UtcNow < until)
|
||||
{
|
||||
if (new Uri(page.Url).AbsolutePath.StartsWith("/login"))
|
||||
return true;
|
||||
if (await page.Locator("article[data-uri], [data-feed-empty]").CountAsync() > 0)
|
||||
return false;
|
||||
await page.WaitForTimeoutAsync(250);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static async Task Through(IPage page, Pasture.Persona persona)
|
||||
{
|
||||
try
|
||||
|
||||
Reference in new issue
Block a user