未找到 Puppeteer 选择器
Puppeteer selector not being found
我在调试为什么未单击查询选择器时遇到问题 - 我可以在 chrome 中搜索它,如果在开发工具中使用 document.querySelector(),它会找到查询,这让我相信它是正确的,但是它没有按下它并且只是超时
点击方式:
async function click(page, selector, timeout) {
await beforeAction(page, timeout);
await page.waitForSelector(selector);
await page.waitFor(200);
await page.click(selector);
}
执行的主要方法:
async function existingStart(page) {
await loadCookies(page);
await page.goto(
"https://mc.s7.exacttarget.com/cloud/#app/Email/C12/Default.aspx?entityType=none&entityID=0&ks=ks%23Content"
, {
waitUntil: 'load',
timeout: 0
}
);
await page.waitFor(200);
const contentBuilderFrame = await findFrame(page, "contentbuilder");
const searchField = await contentBuilderFrame.$(".contentsearch > input");
searchField.focus();
await page.keyboard.type("20200903");
await page.waitFor(500);
await page.keyboard.press('Enter');
await page.waitFor(5000);
// Screenshot to check page state
await page.screenshot({
path: "./screenshot.png",
fullPage: true
});
await page.waitFor(500);
// Times out
await click(page, '#contentRepeater > div.repeater-viewport > div.repeater-canvas.scrolling > div > div > table > tbody > tr:nth-child(1) > td:nth-child(3) > div > div > div > div')
}
如果我在单击选择器之前调用 find Iframe 方法:
await findFrame(page, "contentbuilder");
什么都没发生,它因 JSHandler 问题而出错,有人遇到过类似的事情吗?难道问题出在 Iframe 上?奇怪的是 searchField 输入和按键都正常。而且,它是同一个iframe,所以我不应该调用两次findFrame。
操作前:
async function beforeAction(page, timeout) {
if (timeout != null) {
await page.waitFor(timeout);
}
var isLoading = await isPageLoading(page);
while (isLoading) {
await new Promise((resolve) => setTimeout(resolve, 1000));
isLoading = await isPageLoading(page);
}
}
由于我们在评论中得出了答案,所以我将其张贴在这里以供遇到此问题的其他人使用。
由于目标选择器在 iframe (contentbuilder
) 中,作为参数传递给函数 click
的上下文不是 page
,而是 iframe 元素:contentBuilderFrame
.
我在调试为什么未单击查询选择器时遇到问题 - 我可以在 chrome 中搜索它,如果在开发工具中使用 document.querySelector(),它会找到查询,这让我相信它是正确的,但是它没有按下它并且只是超时
点击方式:
async function click(page, selector, timeout) {
await beforeAction(page, timeout);
await page.waitForSelector(selector);
await page.waitFor(200);
await page.click(selector);
}
执行的主要方法:
async function existingStart(page) {
await loadCookies(page);
await page.goto(
"https://mc.s7.exacttarget.com/cloud/#app/Email/C12/Default.aspx?entityType=none&entityID=0&ks=ks%23Content"
, {
waitUntil: 'load',
timeout: 0
}
);
await page.waitFor(200);
const contentBuilderFrame = await findFrame(page, "contentbuilder");
const searchField = await contentBuilderFrame.$(".contentsearch > input");
searchField.focus();
await page.keyboard.type("20200903");
await page.waitFor(500);
await page.keyboard.press('Enter');
await page.waitFor(5000);
// Screenshot to check page state
await page.screenshot({
path: "./screenshot.png",
fullPage: true
});
await page.waitFor(500);
// Times out
await click(page, '#contentRepeater > div.repeater-viewport > div.repeater-canvas.scrolling > div > div > table > tbody > tr:nth-child(1) > td:nth-child(3) > div > div > div > div')
}
如果我在单击选择器之前调用 find Iframe 方法:
await findFrame(page, "contentbuilder");
什么都没发生,它因 JSHandler 问题而出错,有人遇到过类似的事情吗?难道问题出在 Iframe 上?奇怪的是 searchField 输入和按键都正常。而且,它是同一个iframe,所以我不应该调用两次findFrame。
操作前:
async function beforeAction(page, timeout) {
if (timeout != null) {
await page.waitFor(timeout);
}
var isLoading = await isPageLoading(page);
while (isLoading) {
await new Promise((resolve) => setTimeout(resolve, 1000));
isLoading = await isPageLoading(page);
}
}
由于我们在评论中得出了答案,所以我将其张贴在这里以供遇到此问题的其他人使用。
由于目标选择器在 iframe (contentbuilder
) 中,作为参数传递给函数 click
的上下文不是 page
,而是 iframe 元素:contentBuilderFrame
.