QuerySelector for Web Elements Inside iframe

JavascriptHtmlIframeSelenium WebdriverCss Selectors

Javascript Problem Overview


Edit: New title. What I'm looking for is a document.querySelector for elements inside an iframe.

I've done quite a bit of Googling for an answer and finally I'm stumped.

I'm trying to query inside an iframe. I'm building string selectors to be used in Selenium and usually I just inspect the element with Firebug, and use document.querySelectorAll("theStringIBuid");

But it doesn't work with elements inside iframes. I've tried all of the below to get an element "radiobutton1" inside the "page-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

Thanks-

Javascript Solutions


Solution 1 - Javascript

simple es6 adapted from h3manth:

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

Solution 2 - Javascript

if the original page's url isn't at the same domain with the iframe content, the javascript will treat the iframe as a black box, meaning it will not see anything inside it.

Solution 3 - Javascript

You can do this:

document.querySelector("iframe").contentWindow.document.querySelector("button")

https://m.youtube.com/watch?v=-mNp3-UX9Qc

Solution 4 - Javascript

Here's a snippet for diving into same-origin frames (ie-compatible 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;
}

This dives into both frameset frames and iframes alike. It may even survive (though not enter) cross origin frames.

Solution 5 - Javascript

You can simply use

document.querySelector("iframe").contentDocument.body.querySelector("#btn")

First query selector is to select the iframe. Then we can access ifram dom using content document and use the 2nd query selector to select the element inside iframe.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionsnugView Question on Stackoverflow
Solution 1 - JavascriptcregoxView Answer on Stackoverflow
Solution 2 - JavascriptAero WangView Answer on Stackoverflow
Solution 3 - JavascriptRoyer AdamesView Answer on Stackoverflow
Solution 4 - JavascriptLOASView Answer on Stackoverflow
Solution 5 - JavascriptChamupathi Gigara HettigeView Answer on Stackoverflow