2012-03-30 3 views
10

Я использую phantomjs (1.5) и casperjs для своих функциональных тестов.PhantomJS и 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() 

Итак, я зашел на сайт vk.com (социальная сеть в России), мое приложение загружено iframe.

Как я могу использовать элементы в iFrame, например, нажмите кнопку?

ответ

11

Последние версии PhantomJS позволяют использовать флаг --web-security = no, не соблюдая политику безопасности.

Следующий скрипт (только PhantomJS) получает название ссылки в iframe, 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(); 
}); 

Помните, что не запускается с параметром

phantomjs --web-безопасности = нет iframe.js http://anysite.org

+0

DudeSweet, этот код был написан в 2013 году, и в то время существовали aswift_2 и google_ads_frame3 id в adense, мало что нелогично, что код работает без изменений через несколько лет (думая, что страница может изменить идентификатор ваших html-элементов в любое время). Наиболее важным из моих ответов является использование опции «--web-security = no» и некоторая небольшая логика javascript для доступа к iframe. –

-3

Если ваше приложение находится в другом домене, чем в iframe, ваш скрипт не может взаимодействовать с содержимым iframe. См.: Can scripts in iframe interact with scripts in the main page

+14

но фантом браузер, а не сценарий ... не должен быть браузер способный взаимодействовать со страницей независимо от доменов? – gcb

Смежные вопросы