javascript - Puppeteer:如何单击元素以便在新选项卡中打开?

标签 javascript web-scraping puppeteer

我有一个包含 25 个可点击元素的列表。我需要在新选项卡中打开它们中的每一个,抓取在新选项卡中打开的新页面,然后将其关闭。然后转到下一个元素,并对列表中的每个元素执行相同的操作。

但是,我在通过单击链接在新选项卡中打开链接时遇到问题。我设法使用 page.goto('link") 打开,但我想让它更加人性化,而不是将链接粘贴到新选项卡中,我想通过单击打开。

let accountsClickElements = await page.$$eval(".result-lockup__name a", el => el.map(x => x.getAttribute("id")));
                                                                                        
 for (let i = 0; i<25; i++) {
     await autoScroll(page);
     await page.waitFor(3000);
     let id = companies[i];
     await page.focus("#"+accountsClickElements[0]);
     accountsClickElements = await page.$$eval(".result-lockup__name a", el => el.map(x => x.getAttribute("id")));
     await page.waitFor(3000);
     await page.focus("#"+accountsClickElements[i]);                             
     await page.click("#"+accountsClickElements[i]);
     await page.waitFor(2000);
     console.log("#"+companies[i].linid);
     await page.goBack(); 
  }                              `

这是一段在同一选项卡中打开链接的代码,但一段时间后,它不会占用所有 25 个元素,并且由于每次打开页面时 id 都会发生变化,因此出现错误。

我已经像这样更改了代码,因此不是单击元素,而是单击 href 属性。目标 _blank 属性在那里,但它仍然在同一个选项卡上打开。你能指出原因吗?

await page.$$eval('.result-lockup__name a', el => el.map(x => x.setAttribute("target", "_blank")));
let accountsClickElements = await page.$$eval(".result-lockup__name a", el => el.map(x => x.getAttribute("href")));                                                                                                                  
for (let i = 0; i<25; i++) {
   await page.waitFor(2000);
   await autoScroll(page);
   await page.waitFor(2000);    
   await page.click('a[href="'+accountsClickElements[i]+'"]');
}

最佳答案

使用 page.click 中键单击:

let options = {button : 'middle'};
await page.click('a[href="'+accountsClickElements[i]+'"]', options)

新标签页可能需要一些时间才能打开,您可以使用 await page.waitForTimeout(1000) 等待。

完整代码:

let accountsClickElements = await page.$$eval('.result-lockup__name a', el => el.map(x => x.getAttribute('href')));

browser.on('targetcreated', function(){                                            
    console.log(accountsClickElements[i]) 
})   

let options = {
    button : 'middle'
};
for (let i = 0; i<25; i++) {
    await page.waitForTimeout(2000);
    await page.focus('a[href="'+accountsClickElements[i]+'"]')                                                    
    await page.click('a[href="'+accountsClickElements[i]+'"]', options)
    const [tab1, tab2, tab3] = await browser.pages();
    await page.waitForTimeout(2000);
    await tab3.bringToFront();                                                                               
    await ListenCompanyPageNewTab(tab3); 
    await tab2.bringToFront();                                                            
} 

关于javascript - Puppeteer:如何单击元素以便在新选项卡中打开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59575748/

相关文章:

python - 将表抓取到列表中

python - BeautifulSoup Python 脚本不再适用于挖掘简单的字段

javascript - 在 Puppeteer 中排除具有某些类的元素

javascript - 为什么这个 puppeteer 的异步函数语法?

javascript - 等待操作完成,然后再在 puppeteer 中执行

javascript - Canvas RGBA 到 RGB 转换

javascript - 仅当 Props 未定义时输入属性 onChange

javascript - 原型(prototype)继承未按预期工作

javascript - 实例化一个对象,以便它可以与多个指令共享

python - 无法使用selenium同时从两个不同深度收集信息