1
votes

Marionnettiste: Comment cliquer sur l'élément pour qu'il s'ouvre dans un nouvel onglet?

J'ai une liste de 25 éléments cliquables. Je dois ouvrir chacun d'eux dans un nouvel onglet, gratter la nouvelle page ouverte dans un nouvel onglet, puis la fermer. Passez ensuite à l'élément suivant et faites de même pour chaque élément de la liste.

Cependant, j'ai des problèmes pour ouvrir les liens dans un nouvel onglet en cliquant dessus. J'ai réussi à ouvrir ensuite avec page.goto ('link ") mais je veux le rendre plus humanisé et au lieu de coller le lien dans le nouvel onglet je veux être ouvert en cliquant. P >

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]+'"]');
}

Ceci est un code qui ouvre les liens dans le même onglet, mais après un certain temps, il ne prend pas les 25 éléments et comme l'id change à chaque fois que j'ouvre la page, je obtenir une erreur.

J'ai changé le code comme ceci donc au lieu de cliquer sur l'élément, c'est en cliquant sur l'attribut href. l'attribut cible _blank est là, mais il s'ouvre toujours sur le même onglet. Pouvez-vous expliquer pourquoi?

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(); 
  }                              `


0 commentaires

3 Réponses :


0
votes

Vous pouvez créer une page d'abord sur l'instance du navigateur, puis accéder à cette page.

page de const = attendre browser.newPage ();

attendez page.goto (' https://url.com ');


1 commentaires

Merci mais je l'ai déjà. Le but est d'être plus humain, tout comme un humain ferait un clic du milieu de la souris sur le lien.



3
votes

ajoutez target = "_ blank" aux éléments sur lesquels vous souhaitez cliquer:

await page.$$eval('.result-lockup__name a', el => el.map(x => x.setAttribute("target", "_blank")));


1 commentaires

J'ai changé le code l (voir edit) donc au lieu de cliquer sur l'élément, c'est en cliquant sur l'attribut href. l'attribut cible _blank est là, mais il s'ouvre toujours sur le même onglet. Pouvez-vous expliquer pourquoi?



0
votes

J'ai trouvé la réponse. Il y a un clic central sur l'événement page.click Nécessaire pour définir les options

let accountsClickElements = await page.$$eval(".result-lockup__name a", el => el.map(x => x.getAttribute("href")));
                    let options = {
                        button : "middle"
                      };

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

                     for (let i = 0; i<25; i++) {
                          await page.waitFor(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.waitFor(2000);
                          await tab3.bringToFront();                                                                               
                          await ListenCompanyPageNewTab(tab3); 
                          await tab2.bringToFront();                                                            
                    } 

que de le transmettre à l'événement de clic

                              await page.click('a[href="'+accountsClickElements[i]+'"]',options)

code complet ici

 let options = {button : "middle"};


0 commentaires