Restore Doctor search after AdvisoryAI cold-start race
This commit is contained in:
@@ -141,19 +141,27 @@ async function resolveLink(page, options, timeoutMs = ELEMENT_WAIT_MS) {
|
||||
const deadline = Date.now() + timeoutMs;
|
||||
|
||||
while (Date.now() < deadline) {
|
||||
if (options.hrefIncludes) {
|
||||
const candidates = page.locator(`a[href*="${options.hrefIncludes}"]`);
|
||||
const count = await candidates.count();
|
||||
for (let index = 0; index < count; index += 1) {
|
||||
const candidate = candidates.nth(index);
|
||||
const text = ((await candidate.innerText().catch(() => '')) || '').trim();
|
||||
if (!options.name || text === options.name || text.includes(options.name)) {
|
||||
return candidate;
|
||||
}
|
||||
const anchors = page.locator('a');
|
||||
const anchorCount = await anchors.count();
|
||||
for (let index = 0; index < anchorCount; index += 1) {
|
||||
const candidate = anchors.nth(index);
|
||||
const href = ((await candidate.getAttribute('href').catch(() => '')) || '').trim();
|
||||
const text = ((await candidate.innerText().catch(() => '')) || '').trim();
|
||||
|
||||
if (options.hrefIncludes && !href.includes(options.hrefIncludes)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (options.name && !(text === options.name || text.includes(options.name))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (href || text) {
|
||||
return candidate;
|
||||
}
|
||||
}
|
||||
|
||||
if (options.name) {
|
||||
if (!options.hrefIncludes && options.name) {
|
||||
const roleLocator = page.getByRole('link', { name: options.name }).first();
|
||||
if ((await roleLocator.count()) > 0) {
|
||||
return roleLocator;
|
||||
@@ -278,7 +286,7 @@ async function main() {
|
||||
{
|
||||
route: '/mission-control/board',
|
||||
actions: [
|
||||
{ action: 'link:View all', name: 'View all', expectedPath: '/releases/runs' },
|
||||
{ action: 'link:View all', name: 'View all', hrefIncludes: '/releases/runs', expectedPath: '/releases/runs' },
|
||||
{ action: 'link:Review', name: 'Review', expectedPath: '/releases/approvals' },
|
||||
{ action: 'link:Risk detail', name: 'Risk detail', expectedPath: '/security' },
|
||||
{ action: 'link:Ops detail', name: 'Ops detail', expectedPath: '/ops/operations/data-integrity' },
|
||||
@@ -286,24 +294,21 @@ async function main() {
|
||||
{
|
||||
action: 'link:Stage detail',
|
||||
name: 'Detail',
|
||||
hrefIncludes:
|
||||
'/setup/topology/environments/stage/posture?tenant=demo-prod®ions=us-east&environments=stage&timeWindow=7d®ion=us-east&environment=stage',
|
||||
hrefIncludes: '/setup/topology/environments/stage/posture',
|
||||
expectedPath: '/setup/topology/environments/stage/posture',
|
||||
expectQuery: { environment: 'stage', region: 'us-east' },
|
||||
},
|
||||
{
|
||||
action: 'link:Stage findings',
|
||||
name: 'Findings',
|
||||
hrefIncludes:
|
||||
'/security/findings?tenant=demo-prod®ions=us-east&environments=stage&timeWindow=7d®ion=us-east&environment=stage',
|
||||
hrefIncludes: '/security/findings?tenant=demo-prod®ions=us-east&environments=stage',
|
||||
expectedPath: '/security/findings',
|
||||
expectQuery: { environment: 'stage', region: 'us-east' },
|
||||
},
|
||||
{
|
||||
action: 'link:Risk table open stage',
|
||||
name: 'Open',
|
||||
hrefIncludes:
|
||||
'/setup/topology/environments/stage/posture?tenant=demo-prod®ions=us-east&environments=stage&timeWindow=7d®ion=us-east&environment=stage',
|
||||
hrefIncludes: '/setup/topology/environments/stage/posture',
|
||||
expectedPath: '/setup/topology/environments/stage/posture',
|
||||
expectQuery: { environment: 'stage', region: 'us-east' },
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user