web-dev-qa-db-fra.com

QuerySelector for Web Elements Inside iframe

Modifier: nouveau titre. Ce que je recherche, c'est un document.querySelector pour les éléments à l'intérieur d'un iframe.

J'ai fait pas mal de recherches sur Google pour une réponse et finalement je suis perplexe.

J'essaie d'interroger à l'intérieur d'un iframe. Je construis des sélecteurs de chaînes à utiliser dans Selenium et généralement j'inspecte simplement l'élément avec Firebug et j'utilise document.querySelectorAll ("theStringIBuid");

Mais cela ne fonctionne pas avec les éléments à l'intérieur des iframes. J'ai essayé tout ce qui suit pour obtenir un élément "radiobutton1" à l'intérieur de l'iframe "page-iframe".

var elem1 = ".page-iframe";
console.log(elem1);
var elem2 = ".radiobutton1";
console.log(elem2);
document.querySelectorAll(elem1+elem2+"");

document.querySelectorAll('.page-iframe').contentWindow.document.body.querySelectorAll('.radiobutton1')
document.getElementById('.page-iframe').contentWindow.document.body.innerHTML;

[].forEach.call( document.querySelectorAll('.page-iframe'), 
function  fn(elem){ 
console.log(elem.contentWindow.document.body.querySelectorAll('.radiobutton1')); });

var contentWindow = document.getElementById('.page-iframe').contentWindow 
var contentWindow = document.querySelectorAll('.page-iframe') 
var contentWindow = document.querySelectorAll('.page-iframe')[0].contentWindow

Merci-

25
snug

es6 simple adapté de h3manth :

document.querySelectorAll('iframe').forEach( item =>
    console.log(item.contentWindow.document.body.querySelectorAll('a'))
)
27
cregox

si l'url de la page d'origine n'est pas dans le même domaine que le contenu iframe, le javascript traitera l'iframe comme une boîte noire, ce qui signifie qu'il ne verra rien à l'intérieur.

19
Aero Wang

Voici un extrait pour plonger dans des cadres de même origine (c'est-à-dire ES5 compatible):

function findInFramesRec(selector, doc) {
  var hit = doc.querySelector(selector);
  if (hit) return hit;
  var frames = Array.prototype.slice.call(doc.frames);
  for(var i = 0; (i < frames.length) &&   !hit   ; i++) {
    try {
      if (!frames[i] || !frames[i].document) continue;
      hit = findInFramesRec(selector, frames[i].document);
    } catch(e) {}
  }
  return hit;
}

Cela plonge à la fois dans les cadres de frameset et dans les iframes. Il peut même survivre (mais pas entrer) aux images d'origine croisées.

0
LOAS