Подтвердить что ты не робот

QuerySelector для веб-элементов внутри iframe

Изменить: новый заголовок. Я ищу документ document.querySelector для элементов внутри iframe.

Я сделал довольно много Googling для ответа, и, наконец, я в тупике.

Я пытаюсь выполнить запрос внутри iframe. Я строю селектора строк, которые будут использоваться в Selenium, и обычно я просто проверяю элемент с Firebug и использую document.querySelectorAll( "theStringIBuid" );

Но он не работает с элементами внутри iframe. Я попробовал все ниже, чтобы получить элемент "radiobutton1" внутри iframe "страницы-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

Спасибо -

4b9b3361

Ответ 1

простой es6 адаптирован из h3manth:

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

Ответ 2

Если исходный url страницы не находится в том же домене с содержимым iframe, javascript будет обрабатывать iframe как черный ящик, то есть он ничего не увидит внутри него.

Ответ 3

Вот фрагмент кода для погружения в кадры одного и того же происхождения (т.е. совместимый с ES5):

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;
}

Это погружается как во фреймы, так и в фреймы. Это может даже пережить (хотя и не войти) рамки перекрестного происхождения.