fix(bikegear): use real clicks for product detail navigation
This commit is contained in:
parent
d89db25aee
commit
500537f8ab
@ -130,7 +130,9 @@ async function main() {
|
|||||||
|
|
||||||
let response;
|
let response;
|
||||||
if (TEST_URL !== WARM_URL && !TEST_URL.includes("?page=")) {
|
if (TEST_URL !== WARM_URL && !TEST_URL.includes("?page=")) {
|
||||||
response = await clickLinkForUrl(page, TEST_URL);
|
const clickResult = await clickLinkForUrl(page, TEST_URL);
|
||||||
|
response = clickResult.response;
|
||||||
|
console.log(`[BIKEGEAR-PROXY-TEST] clickedLink=${clickResult.clicked}`);
|
||||||
}
|
}
|
||||||
if (!response) {
|
if (!response) {
|
||||||
response = await page.goto(TEST_URL, {
|
response = await page.goto(TEST_URL, {
|
||||||
@ -167,19 +169,30 @@ async function main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function clickLinkForUrl(page, url) {
|
async function clickLinkForUrl(page, url) {
|
||||||
|
const locator = page.locator(`xpath=//a[@href=${xpathString(url)}]`).first();
|
||||||
|
const count = await locator.count().catch(() => 0);
|
||||||
|
if (!count) return { clicked: false, response: null };
|
||||||
|
|
||||||
const navigationPromise = page.waitForNavigation({ waitUntil: "domcontentloaded", timeout: 45000 })
|
const navigationPromise = page.waitForNavigation({ waitUntil: "domcontentloaded", timeout: 45000 })
|
||||||
.catch(() => null);
|
.catch(() => null);
|
||||||
const clicked = await page.evaluate((targetUrl) => {
|
|
||||||
const links = Array.from(document.querySelectorAll("a[href]"));
|
|
||||||
const link = links.find((a) => a.href === targetUrl);
|
|
||||||
if (!link) return false;
|
|
||||||
link.click();
|
|
||||||
return true;
|
|
||||||
}, url).catch(() => false);
|
|
||||||
|
|
||||||
if (!clicked) return null;
|
await locator.scrollIntoViewIfNeeded().catch(() => {});
|
||||||
|
await locator.hover({ timeout: 5000 }).catch(() => {});
|
||||||
|
await page.waitForTimeout(500);
|
||||||
|
await locator.click({ timeout: 10000 }).catch(() => null);
|
||||||
await page.waitForURL(url, { timeout: 45000 }).catch(() => {});
|
await page.waitForURL(url, { timeout: 45000 }).catch(() => {});
|
||||||
return navigationPromise;
|
|
||||||
|
return {
|
||||||
|
clicked: true,
|
||||||
|
response: await navigationPromise,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function xpathString(value) {
|
||||||
|
const text = String(value);
|
||||||
|
if (!text.includes("'")) return `'${text}'`;
|
||||||
|
if (!text.includes('"')) return `"${text}"`;
|
||||||
|
return `concat('${text.replace(/'/g, `', "'", '`)}')`;
|
||||||
}
|
}
|
||||||
|
|
||||||
main().catch((error) => {
|
main().catch((error) => {
|
||||||
|
|||||||
@ -202,8 +202,9 @@ async function fetchHtmlWithBrowser(url, referer = null) {
|
|||||||
}
|
}
|
||||||
await page.waitForTimeout(2500);
|
await page.waitForTimeout(2500);
|
||||||
|
|
||||||
response = await clickLinkForUrl(page, url);
|
const clickResult = await clickLinkForUrl(page, url);
|
||||||
if (response) {
|
response = clickResult.response;
|
||||||
|
if (clickResult.clicked) {
|
||||||
// Navigation happened through the listing page link.
|
// Navigation happened through the listing page link.
|
||||||
} else {
|
} else {
|
||||||
response = await page.goto(url, {
|
response = await page.goto(url, {
|
||||||
@ -255,19 +256,30 @@ async function fetchHtmlWithBrowser(url, referer = null) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function clickLinkForUrl(page, url) {
|
async function clickLinkForUrl(page, url) {
|
||||||
|
const locator = page.locator(`xpath=//a[@href=${xpathString(url)}]`).first();
|
||||||
|
const count = await locator.count().catch(() => 0);
|
||||||
|
if (!count) return { clicked: false, response: null };
|
||||||
|
|
||||||
const navigationPromise = page.waitForNavigation({ waitUntil: "domcontentloaded", timeout: 45000 })
|
const navigationPromise = page.waitForNavigation({ waitUntil: "domcontentloaded", timeout: 45000 })
|
||||||
.catch(() => null);
|
.catch(() => null);
|
||||||
const clicked = await page.evaluate((targetUrl) => {
|
|
||||||
const links = Array.from(document.querySelectorAll("a[href]"));
|
|
||||||
const link = links.find((a) => a.href === targetUrl);
|
|
||||||
if (!link) return false;
|
|
||||||
link.click();
|
|
||||||
return true;
|
|
||||||
}, url).catch(() => false);
|
|
||||||
|
|
||||||
if (!clicked) return null;
|
await locator.scrollIntoViewIfNeeded().catch(() => {});
|
||||||
|
await locator.hover({ timeout: 5000 }).catch(() => {});
|
||||||
|
await page.waitForTimeout(500);
|
||||||
|
await locator.click({ timeout: 10000 }).catch(() => null);
|
||||||
await page.waitForURL(url, { timeout: 45000 }).catch(() => {});
|
await page.waitForURL(url, { timeout: 45000 }).catch(() => {});
|
||||||
return navigationPromise;
|
|
||||||
|
return {
|
||||||
|
clicked: true,
|
||||||
|
response: await navigationPromise,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function xpathString(value) {
|
||||||
|
const text = String(value);
|
||||||
|
if (!text.includes("'")) return `'${text}'`;
|
||||||
|
if (!text.includes('"')) return `"${text}"`;
|
||||||
|
return `concat('${text.replace(/'/g, `', "'", '`)}')`;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── HTTP fetch (axios) ─────────────────────────────────────────────────────
|
// ── HTTP fetch (axios) ─────────────────────────────────────────────────────
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user