【问题标题】:JSON parse error when switching to Google safeframe ads切换到 Google 安全框架广告时出现 JSON 解析错误
【发布时间】:2016-04-04 13:16:43
【问题描述】:

我正在尝试切换 DOM 中的所有 iframe:

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 广告安全框架在切换时会抛出此异常:

“JSON 解析错误:未终止的字符串”

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

Google 广告 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 被缩短,因为 name 属性包含 iframe DOM,超过 60,000 个字符。

任何人都知道如何让 Selenium 切换到这些谷歌广告安全框架?

【问题讨论】:

  • 您能分享您正在使用的网页的链接吗?谢谢。
  • 由于广告循环的性质,这很困难,但是 express.co.uk 通常在每次刷新时都会在其中显示一个安全框架广告。使用顶层属性 data-is-safeframe="true" 制作的安全框广告。我认为值得一提的是,与 Selenium 不同,FireBug 解析这些安全帧没有问题。
  • 谢谢,尝试在 express.co.uk 页面上从一个框架切换到另一个框架。没有遇到任何问题。只是在黑暗中拍摄 - 检查您是否使用最新的 selenium 和 firefox 版本。任何其他附加信息也可以提供帮助。
  • 您好,感谢您的测试。我正在使用最新的驱动程序(2.53)但是我应该提到我正在使用 Phantomjs。我会用FF再次测试并报告。
  • 好的,谢谢,顺便说一句,您使用的是哪个 PhantomJS 版本?

标签: c# selenium iframe phantomjs


【解决方案1】:

我已经能够在http://express.co.uk/ 网站上重现该问题 - 不时会在 DOM 中添加一个安全框架。据我了解,问题是当您尝试使用框架IWebElement 实例或idname、@987654330 切换到安全框架iframe(它的data-is-safeframe 属性设置为true)时@ 响应 JSON 解析错误。这应该在PhantomJS issue tracker 报告,因为它与特定的 selenium 语言绑定无关(我使用了最新的 Python/Selenium - 抛出相同的错误)。

解决方法:

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

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

【讨论】:

  • 我不认为你能给我一个指针,让我在 Windows 环境中以无头方式运行 Firefox/Chrome?
  • @badger110 我没有这方面的 Windows 经验,但考虑使用虚拟显示器。在linux的情况下,我个人已经成功使用了xvfb包和firefox ..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
  • 2016-12-18
  • 1970-01-01
相关资源
最近更新 更多