2016-04-04 199 views
3

我试图通过DOM中的所有I帧切换:切换时JSON解析错误

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

一些谷歌的广告safeframes抛出此异常:

"JSON Parse error: Unterminated string"

我希望Selenium在切换到帧时将内容读取为HTML而不是JSON。

的谷歌广告safeframe我想切换到:

<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被缩短,因为它是超过60000个字符的名称属性包含I帧DOM。

任何人都知道如何让Selenium切换到这些谷歌广告safeframes?

+1

您能分享您正在使用的网页的链接吗?谢谢。 – alecxe

+0

由于周期性广告的性质,这很困难,但http://express.co.uk通常在每次刷新时都有一个安全框架广告。安全框架广告与顶级属性data-is-safeframe =“true”匹配。我认为值得一提的是,与Selenium不同,FireBug在解析这些安全框架时没有问题。 – badger110

+0

谢谢,试图在express.co.uk网页上切换帧..没有遇到任何问题。在黑暗中拍摄 - 检查您是否使用最新的硒和firefox版本。任何其他附加信息也可以提供帮助。 – alecxe

回答

1

我已经能够在http://express.co.uk/网站上重现问题 - 有时会向DOM添加一个安全框架。从我的理解,问题是,当你尝试切换到一个IFRAME的SafeFrame(它有data-is-safeframe属性设置为true)使用帧IWebElement实例或它的idnamePhantomJS响应以JSON解析错误。这应该在PhantomJS issue tracker上报告,因为它与特定的硒语言绑定无关(我已经使用了最新的Python/Selenium - 引发了相同的错误)。

解决方法:

  • 使用frame index切换到框架,工作对我来说(完整的Python代码在这个gist)。例如,这里是你如何可以切换到C#中的第一帧(从零开始的索引):

    driver.SwitchTo().Frame(0); 
    
  • 开关FirefoxChrome
(您可以在“无头”模式下也运行它们)
+0

我不认为你可以给我一个在Windows环境下运行Firefox/Chrome的指针吗? – badger110

+1

@ badger110我没有这方面的Windows体验,但看看使用虚拟显示器。在Linux的情况下,我亲自成功地使用Firefox的xvfb包。 – alecxe