2
votes

Avec Puppeteer: Comment puis-je obtenir un iframe à partir de son sélecteur d'élément parent?

Je veux obtenir une iframe comme cadre et cliquer sur un élément dans le cadre, mais l'iframe n'a pas de nom et le site Web a de nombreux cadres ( page.frames () renvoie 14).

Et je n'ai pas l'autorisation de modifier le code HTML. Je ne peux modifier que le JavaScript.

Je pense que la meilleure façon d'identifier l'iframe dans ce cas est à partir de son élément parent.

Comment puis-je faire cela avec le marionnettiste?

<div id="foo">
  <iframe>
    #document
  </iframe>
</div>


0 commentaires

3 Réponses :


1
votes

Ayant un identifiant de n'importe quel élément, vous pouvez facilement parcourir ses enfants et trouver tous ceux qui remplissent des critères spécifiques, par exemple être une iframe.
La fonction de filtre ne peut pas être utilisée, car il ne s’agit pas d’un tableau, mais d’une liste de nœuds.

<div id="foo">
  <iframe>
    #document
  </iframe>
</div>
var parent = document.getElementById("foo");
var iframes = [];
for(var i = 0; i < parent.children.length; i++){
  var child = parent.children[i];
  if(child.localName == 'iframe'){
    iframes.push(child);
  }
  };
console.log(iframes)


4 commentaires

Je vous remercie. Mais de cette façon, comment puis-je cliquer sur une iframe?


Pour un élément donné, la fonction click () devrait fonctionner, et vous pouvez utiliser le document de contenu afin d'obtenir les nœuds d'iframe.


noooo ... J'ai écrit ce const parent = document.getElementById ('foo'); const framedom = parent.children [0] .contentDocument; et framedom est nul. Est-ce mal?


Essayez-vous ceci sur un exemple réel? Parce que pour un exemple ci-dessus, il peut être nul, puisqu'il ne s'agit pas vraiment de #document.



4
votes

Vous pouvez utiliser le elementHandle. contentFrame () pour renvoyer un cadre à partir d'un handle d'élément.

Citation tirée de la documentation:

Résout le cadre de contenu pour les descripteurs d'élément référençant les nœuds iframe, ou null sinon

const elementHandle = await page.$('div#foo iframe');
const frame = await elementHandle.contentFrame();


1 commentaires

génial! J'ai résolu ce problème avec l'URL de frame, mais votre chemin est meilleur. Je vais réparer mon code. Je vous remercie.



3
votes

Notez que vous devez également ajouter ces options de démarrage du navigateur pour exécuter la méthode contentFrame, sinon elle renverra null:

const browser = await puppeteer.launch({
    headless: false,
    args: [
      '--disable-web-security',
      '--disable-features=IsolateOrigins,site-per-process'
    ]
});


0 commentaires