Javascript 如何使用Puppeter在SPA中检索新页面内容?

Javascript 如何使用Puppeter在SPA中检索新页面内容?,javascript,puppeteer,Javascript,Puppeteer,我试图用一个初始的内容体来抓取加载的页面,然后在页面底部单击“加载更多”按钮。单击“加载更多”按钮时,按钮将从页面中删除,页面将进一步加载页面下方的其他内容(保留初始加载时的内容),并在页面底部放置一个新的“加载更多”按钮。单击“加载更多”按钮时,页面的URL不会更改。也就是说,它的行为类似于单页应用程序(SPA) 使用Puppeter,我可以导航到以下页面: let page = await browser.newPage(); await page.goto('https://www.s

我试图用一个初始的内容体来抓取加载的页面,然后在页面底部单击“加载更多”按钮。单击“加载更多”按钮时,按钮将从页面中删除,页面将进一步加载页面下方的其他内容(保留初始加载时的内容),并在页面底部放置一个新的“加载更多”按钮。单击“加载更多”按钮时,页面的URL不会更改。也就是说,它的行为类似于单页应用程序(SPA)

使用Puppeter,我可以导航到以下页面:

let page = await browser.newPage();
  await page.goto('https://www.someURL.com/home', {
    waitUntil: 'domcontentloaded',
  });
然后我使用
page.$$eval()
找到“加载更多”按钮并单击它。页面将加载附加内容,并在底部添加一个新的“加载更多”按钮。但是,我找不到一种使用Puppeter来“刷新”我的
页面
变量的方法,这样我就可以第二次调用
page.eval$$()
来找到新的“加载更多”按钮。调用
page.reload()

我搜遍了《木偶演员》的文档,看了几十个例子,却找不到一个方法来做到这一点。鉴于水疗的盛行,我一定忽略了一些显而易见的事情

这可能吗

编辑:使用@vsemozhetbyt建议的附加代码:

 let theButton = await page.$('button.sc-fzoiQi');
  do {
    await page.evaluate(theButton => {
      theButton.click();
    }, theButton);
  } while ((await buttonExists(page)) !== null);
};
async function buttonExists(page) {
  return await page.$('button.sc-fzoiQi');
}

使用上面的方法,第一次单击按钮,但是永远不会计算
while
表达式。也就是说,它里面的语句-
返回等待页。$('button.sc fzoiQi')
永远不会返回。

您可以尝试这样的方法

do{
//获取按钮,单击,等待数据,获取数据。
}while(等待页面。$(buttonSelector)!==null);

不幸的是,“加载更多”按钮是页面上许多按钮元素之一,选择它的唯一方法是通过
页面选择所有按钮。$$eval()
然后使用
forEach
元素检查返回数组中的每个元素。textContent==“加载更多”
您可以将此逻辑提取到异步函数中,并在
while
子句中调用它。或者您可以使用
while
循环
break
。因此,我找到了一种方法,可以使用
页面。$()
选择按钮,而不管它在页面上出现多少次。我已经用采纳您建议的附加代码更新了我的问题,但是,
中对
页面的调用。$()
,而
永远不会返回。想法?试着把这一行放在
do
子句中:
let theButton=wait page.$('button.sc fzoiQi')。该按钮可以在每次更新时删除和重新创建,因此我们需要在每次迭代中对元素进行新的引用。奇怪的是,它需要我减慢
浏览器
实例的速度(将
sloMo:1000
传递给
puppeter.launch()
为了让点击生效,但我可以接受。谢谢!你也可以尝试在木偶演员的上下文中使用
延迟
选项点击,以检查这是否有帮助。也许这是一个更轻的缺点。这是否回答了你的问题?