Javascript внутри iframe.Соскоб с Ватира - PullRequest
2 голосов
/ 01 марта 2012

Я пытаюсь выяснить WATIR. Здесь ситуация. Я хочу отслеживать рекламу на нескольких веб-сайтах, но очистить их - непростая задача, потому что они находятся в iframe, тогда есть еще одна ссылка iframe, созданная с помощью JavaScript. Только тогда приходит страница, которую я хотел бы получить.

Вот код на главной странице:

<iframe width="300" height="250" scrolling="no" frameborder="0"
id="adbottomleft" src="/ad/left1" name="adbottomleft"></iframe>

Вот что говорит iframe:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<style type="text/css">

 body {
     background-color: black;
     margin:0;
     padding:0;
 }</style>
</head>
<body>
<!--  Rubicon Project Tag -->
<!--  Site: MangaReader   Zone: ROS_BTF_LEFT   Size: Medium Rectangle  -->
<div id="adfooter" style="width:300px;height:250px;"></div>
<script language="JavaScript" type="text/javascript">
function tl(){
    var loaded = 0;
    try {
        loaded = parent.document['adver'];
    } catch(e) { loaded = 0; }
    if (loaded != 1) {
        setTimeout(tl, 25);
    } else {
            var dest = document.getElementById('adfooter');
            var lframe = document.createElement('iframe');
            lframe.setAttribute('id','adbleft');
            lframe.setAttribute('width','300');
            lframe.setAttribute('height','250');
            lframe.setAttribute('scrolling','no');
            lframe.setAttribute('frameborder', '0');
            lframe.setAttribute('src', 'http://ad.mangareader.net/btleft1');
            dest.appendChild(lframe);
    }
}
(function (){
tl();
}());
</script>
</body>
</html>

Он генерирует еще один iframe, который выглядит следующим образом:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<style type="text/css">
                * {
            margin:0;
            padding:0;
        }
        body {
            margin-left: 0px;
            margin-top: 0px;
        }
        </style>
</head>
<body>
<!--  Rubicon Project Tag -->
<!--  Site: MangaReader   Zone: ROS_BTF_LEFT   Size: Medium Rectangle  -->
<script language="JavaScript" type="text/javascript">
var cb = Math.random();
var d = document;
var iframe = "&fr=" + (window != top);
var ref = "";
try {
    if (window != top) {
      ref = "&rf="+escape(d.referrer);
   }
} catch (ignore) { }
d.write("<iframe id='25504.15' name='25504.15' src='' framespacing='0' frameborder='no' scrolling='no' align='middle' width='300' height='250' marginheight='0' marginwidth='0'></iframe>");
d.getElementById('25504.15').src='http://optimized-by.rubiconproject.com/a/8240/13310/25504-15.html?cb='+cb+ref;
</script>
</body>
</html>

Только тогда приходит последняя страница, которую мне интересно почистить.

<html>
  <head>
    <meta http-equiv="Pragma" content="no-cache">
    <meta http-equiv="expires" content="0">
    <style type="text/css"> body {margin:0px; padding:0px;} </style>
    <script type="text/javascript">
      rubicon_cb = Math.random(); rubicon_rurl = document.referrer; if(top.location==document.location){rubicon_rurl = document.location;} rubicon_rurl = escape(rubicon_rurl);
      window.rubicon_ad = "3260765" + "." + "js";
      window.rubicon_creative = "3299047" + "." + "js";
    </script>
  </head>
  <body>

<a href="http://optimized-by.rubiconproject.com/t/8240/13310/25504-15.3260765.3299047?url=http%3A%2F%2Fwww.animepremium.net" target="_blank"><img src="http://assets.rubiconproject.com/campaigns/100/91/16/5/1325630095ap_300.jpg" border="0" alt="AnimePremium.net" /></a><script defer="defer" type="text/javascript">
{
    if (Math.floor(Math.random()*100) < 1)
    {
        var url;
        var iframe = (window != top);
        url = "http://tap.rubiconproject.com/stats/iframes?pc=8240/13310&ptc=25504&upn="+iframe;
        setTimeout(function(){ new Image().src = url }, 1000);
    }
}
</script>
<script>var _comscore = _comscore || []; _comscore.push({ c1: "8", c2: "6135404", c3: "28", c4: "13310", c10: "3299047" }); (function() { var s = document.createElement("script"), el = document.getElementsByTagName("script")[0]; s.async = true; s.src = (document.location.protocol == "https:" ? "https://sb" : "http://b") + ".scorecardresearch.com/beacon.js"; el.parentNode.insertBefore(s, el); })();</script><DIV STYLE="height:0px; width:0px; overflow:hidden"><IFRAME SRC="http://tap2-cdn.rubiconproject.com/partner/scripts/rubicon/emily.html?rtb_ext=1&pc=8240/13310&geo=eu" FRAMEBORDER="0" MARGINWIDTH="0" MARGINHEIGHT="0" SCROLLING="NO" WIDTH="0" HEIGHT="0" style="height:0px; width:0px"></IFRAME></DIV>
  </body>
</html>

Невозможное задание?

вот что я делаю.

irb
require "watir-webdriver"
browser = Watir::Browser.new :ff
browser.goto "mangareader.net"
browser.frame(:id, "adbottomleft").html - Works!

Если я хочу снять еще один слой, я получаю ошибку

irb
require "watir-webdriver"
browser = Watir::Browser.new :ff
browser.goto "mangareader.net"
browser.frame(:id, "adbottomleft").frame(:id, "adleft").html -> Don't work.

Элемент принадлежит другому фрейму, нежели текущий, - используйте его, чтобы использовать его. Что я должен изменить во втором коде, чтобы он читал следующий iframe?

Я искал несколько дней. Начал с селена, затем htmunit с c #, затем попробовал механизировать с python, но не смог достичь желаемых результатов.

Я продолжаю прыгать. Я наконец-то подумал, что смогу достичь того, чего хотел с WATIR. Мне нужна помощь, чтобы сделать это. Какие-нибудь советы?

1 Ответ

1 голос
/ 01 марта 2012

Идентификатор фрейма, созданного сценарием: «adbleft», а не «adleft», что может быть вашей проблемой.

browser.frame(:id => "adbottomleft").frame(:id => "adbleft").html 

Если идентификатор последнего фрейма не является статическим, вам, возможно, придется выбратьэто по индексу

browser.frame(:id => "adbottomleft").frame(:id => "adbleft").frame(:index => 0)
...