Monday, June 3, 2024
 Popular · Latest · Hot · Upcoming
84
rated 0 times [  87] [ 3]  / answers: 1 / hits: 18583  / 12 Years ago, mon, august 27, 2012, 12:00:00

I have a webpage with an iframe. I'd like to access the contents of the iframe using CasperJS. In particular, I need to click buttons and fill a form. How can I do that?



The main webpage is
main.html:



<html><body>
<a id='main-a' href=javascript:console.log('pressed main-a');>main-a</a>
<iframe src=iframe.html></iframe>
<a id='main-b' href=javascript:console.log('pressed main-b');>main-b</a>
</body></html>


The iframe is:



<html><body>
<a id='iframe-c' href=javascript:console.log('pressed iframe-c');>iframe-c</a>
</body></html>


My naïve approach:



var casper = require('casper').create({
verbose: true,
logLevel: debug
});

casper.start(http://jim.sh/~jim/tmp/casper/main.html, function() {
this.click('a#main-a');
this.click('a#main-b');
this.click('a#iframe-c');
});

casper.run(function() {
this.exit();
});


Doesn't work, of course, because the a#iframe-c selector isn't valid in the main frame:



[info] [phantom] Starting...
[info] [phantom] Running suite: 2 steps
[debug] [phantom] opening url: http://jim.sh/~jim/tmp/casper/main.html, HTTP GET
[debug] [phantom] Navigation requested: url=http://jim.sh/~jim/tmp/casper/main.html, type=Other, lock=true, isMainFrame=true
[debug] [phantom] url changed to http://jim.sh/~jim/tmp/casper/main.html
[debug] [phantom] Navigation requested: url=http://jim.sh/~jim/tmp/casper/iframe.html, type=Other, lock=true, isMainFrame=false
[debug] [phantom] Successfully injected Casper client-side utilities
[info] [phantom] Step 2/2 http://jim.sh/~jim/tmp/casper/main.html (HTTP 200)
[debug] [phantom] Mouse event 'click' on selector: a#main-a
[info] [remote] pressed main-a
[debug] [phantom] Mouse event 'click' on selector: a#main-b
[info] [remote] pressed main-b
[debug] [phantom] Mouse event 'click' on selector: a#iframe-c
FAIL CasperError: Cannot dispatch click event on nonexistent selector: a#iframe-c
# type: uncaughtError
# error: CasperError: Cannot dispatch click event on nonexistent selector: a#iframe-c
CasperError: Cannot dispatch click event on nonexistent selector: a#iframe-c
/tmp:901 in mouseEvent
/tmp:365 in click
/tmp/test.js:9
/tmp:1103 in runStep
/tmp:324 in checkStep


Is there any way to make this work? A hack that involves poking into phantomjs directly would be fine, but I don't know what to do there.



I'm using CasperJS version 1.0.0-RC1 and phantomjs version 1.6.0.


More From » iframe

 Answers
14

Spent forever looking for this, and of course I found the answer minutes after posting the question.



I can use the new frame switching commands added to phantomjs in this commit. Specifically, the this.page.switchToChildFrame(0) and this.page.switchToParentFrame() functions. It appears undocumented, and it also seems that the methods have been changed for upcoming releases, but it does work:



var casper = require('casper').create({
verbose: true,
logLevel: debug
});

casper.start(http://jim.sh/~jim/tmp/casper/main.html, function() {
this.click('a#main-a');
this.click('a#main-b');
this.page.switchToChildFrame(0);
this.click('a#iframe-c');
this.page.switchToParentFrame();
});

casper.run(function() {
this.exit();
});

[#83390] Sunday, August 26, 2012, 12 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
lelasamiraa

Total Points: 208
Total Questions: 99
Total Answers: 107

Location: Uzbekistan
Member since Tue, Nov 30, 2021
3 Years ago
lelasamiraa questions
Thu, Jul 16, 20, 00:00, 4 Years ago
Thu, Oct 17, 19, 00:00, 5 Years ago
Mon, Aug 5, 19, 00:00, 5 Years ago
Thu, Feb 7, 19, 00:00, 5 Years ago
;