2012-03-30 6 views
10

Ich verwende phantomjs (1.5) und casperjs für meine Funktionstests.PhantomJS und iFrame

casper = require('casper').create 
    loadImages: false 


casper.start 'http://vk.com', -> 
    @fill 'form[name="login"]', { email: mail, pass: pass}, true 

casper.thenOpen "http://vk.com/#{app}", -> 
    @echo "User at #{app}" 
casper.then -> 
    @click "iframe['element']" #?! how I can do it? 
casper.then -> 
    @wait 2000000, -> @echo "exit from room: #{num}" 


casper.run() 

Also, ich mich ein, um vk.com (soziales Netzwerk in Russland), meine App mit iframe geladen.

Wie kann ich Elemente in iFrame verwenden, zum Beispiel klicken Sie auf eine Schaltfläche?

Antwort

11

Die neuesten Versionen von PhantomJS erlauben uns, das --web-security = no Flag für die Nichteinhaltung der Sicherheitsrichtlinie zu verwenden.

Das nächste Skript (nur PhantomJS) erhält den Titel eines Links im iframe, einem iframe (adsense).

/* 
    Accessing an iframe (different domain) with PhantomJS 
    Example by deerme.org 
*/ 

var page = require('webpage').create(), system = require('system'), t, address; 
if (system.args.length === 1) 
{ 
    console.log('Usage: phantomfs iframe.js <some URL>'); 
    phantom.exit(); 
} 

t = Date.now(); 
address = system.args[1]; 
page.open(address, function (status) 
{ 
    if (status !== 'success') 
    { 
      console.log('FAIL to load the address'); 
    } 
    else 
    { 
     t = (Date.now()) - t; 
     title = page.evaluate(function(){ 
      return document.title; 
     }); 
     linkTitle = page.evaluate(function(){ 
      // The site containing jQuery? 
      if (typeof(jQuery) == "undefined") 
      { 
       // Force Load 
       page.injectJs('http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'); 
      } 
      // first iframe #aswift_2 
      // second iframe #google_ads_frame3 
      return jQuery("#aswift_2").contents() 
       .find("body") 
        .find("#google_ads_frame3") 
         .contents() 
          .find("body") 
           .contents() 
            .find("a:last") 
             .attr("title"); 
     }); 
     console.log('Loading time: ' + t + ' msec');  
     console.log('Webpage title: ' + title); 
     console.log('Link title (iframe adsense): ' + linkTitle); 
    } 
    phantom.exit(); 
}); 

Denken Sie daran, laufen mit dem Parameter

PhantomJS --web-security = keine iframe.js http://anysite.org

+0

DudeSweet, dieser Code wurde 2013 geschrieben, und zu der Zeit existierten die IDs aswift_2 und google_ads_frame3 in AdSense, es ist ein wenig unlogisch, dass Code nach einigen Jahren nicht mehr geändert wird (weil man denkt, dass eine Seite die ID der HTML-Elemente ändern kann) jederzeit). Die wichtigste meiner Antworten ist, die Option "--web-security = no" und einige kleine Javascript-Logik zu verwenden, um auf den iframe zuzugreifen. –

-3

Wenn sich Ihre Anwendung in einer anderen Domäne als der im Iframe befindet, kann Ihr Skript nicht mit dem Inhalt des Iframes interagieren. Siehe: Can scripts in iframe interact with scripts in the main page

+14

aber Phantom ist der Browser, kein Skript ... sollte nicht der Browser sein Kann man unabhängig von den Domains mit einer Seite interagieren? – gcb