2016-04-04 10 views
3
私はDOM内のすべてのiframeを切り替えるしようとしている

:切り替え時JSONのパースエラーには、GoogleのSafeFrame広告に切り替えたとき

var frames = driver.FindElements(By.TagName("iframe"));  
foreach (var frame in frames) { 
    driver.SwitchTo().Frame(frame); 
    //Do stuff then switch back to default content 
} 

一部のGoogleの広告safeframesはこの例外をスロー:

"JSON Parse error: Unterminated string"

私はフレームに切り替えるときにJSONではなくHTMLとしてコンテンツを読むことをSeleniumが期待していました。

、Googleの広告safeframe Iに切り替えるしようとしています:name属性は、アイフレームのDOMが含まれているとして、それは60,000文字の上にありますよう

<iframe name="1-0-2;63563;<!doctype html><html><head><style><!--a:link { color: #000000 }a:visited { color: #000000 }a:hover { color: #000000 }a:active { color: #000000 } --></style><script><!--(function(){var b=this;var f=String.prototype.trim?function(a){return a.trim()}:function(a){return a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,&quot;&quot;)},m=function(a,c){return a<c?-1:a>c?1:0};var n;a:{var p=b.navigator;if(p){var q=p.userAgent;if(q){n=q;break a}}n=&quot;&quot;};var r=-1!=n.indexOf(&quot;Opera&quot;)||-1!=n.indexOf(&quot;OPR&quot;),t=-1!=n.indexOf(&quot;Trident&quot;)||-1!=n.indexOf(&quot;MSIE&quot;),u=-1!=n.indexOf(&quot;Edge&quot;),v=-1!=n.indexOf(&quot;Gecko&quot;)&amp;&amp;!(-1!=n.toLowerCase().indexOf(&quot;webkit&quot;)&amp;&amp;-1==n.indexOf(&quot;Edge&quot;))&amp;&amp;! 

のiFrame HTMLを短くカットされます。

セレンはどのようにしてこれらのGoogle広告のセーフフレームに切り替えることができますか?

+1

作業しているウェブページへのリンクを共有できますか?ありがとう。 – alecxe

+0

サイクルのある広告の性質上、それは難しいですが、http://express.co.ukでは通常、リフレッシュごとにセーフフレーム広告が表示されます。トップレベルで、属性data-is-safeframe = "true"で整備されたセーフフレーム広告。私は、FireBugがSeleniumと違って、これらのセーフフレームを解析するのに問題がないことに言及する価値があると思います。 – badger110

+0

ありがとうございました。express.co.ukページのフレームからフレームへの切り替えを試みました。問題は発生しませんでした。あなたが最新のセレンとFirefoxのバージョンを使用しているか確認してください。その他の追加情報も役立ちます。 – alecxe

答えて

1

http://express.co.uk/ウェブサイトで問題を再現できました。時々、DOMにセーフフレームが追加されました。私が理解から、問題は、あなたがのSafeFrameはiframeに切り替えるしようとすると、フレームIWebElementインスタンスを使用して(それがtrueに設定data-is-safeframe属性を持っている)ということであるか、それはidまたはname、JSONのパースエラーとPhantomJS応答です。 PhantomJS issue trackerに報告する必要があります。これは、特定のセレンの言語バインディングに関連していないためです(私は最新のPython/Seleniumを使用しました - 同じエラーがスローされます)。

回避策:

  • フレームに切り替えることframe indexを使用し、(完全なPythonのコードは、このgistである)私のために働きました。

    driver.SwitchTo().Frame(0); 
    
  • スイッチFirefoxまたはChrome
(あなたも「ヘッドレス」モードでそれらを実行することができます):たとえば、ここにあなたがC#で非常に最初のフレーム(ゼロベースのインデックス)に切り替えることができる方法です
+0

Windows環境でFirefox/Chromeをヘッドレスで実行するためのポインタを私に与えることはできません。 – badger110

+1

@ badger110私はこれに遭遇したウィンドウを持っていませんが、仮想ディスプレイを使用しています。 Linuxの場合、私は個人的にfirefoxで 'xvfb'パッケージを使用しました。 – alecxe

関連する問題