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>
3 Réponses :
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)
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.
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();
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.
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' ] });