无法使用webdriver.io将焦点切换到Safari中动态加载的iframe

时间:2018-01-11 19:44:16

标签: javascript node.js selenium safari webdriver-io

我正在使用webdriver.io编写自动化E2E测试但是我在尝试在safari上运行测试时遇到了麻烦。我试图测试的页面上有一堆不同的iframe,我需要能够在所有这些iframe之间切换焦点来访问我需要的元素。我遇到的问题是,在safari中,如果一个帧是动态加载的(没有与页面同时加载),我无法将焦点切换到该帧。我使用的测试套件在Chrome和Firefox上运行良好,我只在safari中看到这个问题。我假设这是与浏览器捆绑在一起的Safari驱动程序中的一个错误,但我在这个问题上没有得到苹果支持的好运。我希望有一种方法可以解决这个问题,而无需苹果的修复。

这是我要测试的页面: http://test.spotx.tv/test/ad/js/ados/ima/test.html?vpaid=JS&channel_id=209244&vpi=None&vpaid_mode=2&content_page_url=http%3A%2F%2Fany_non_blacklisted_domain.com

因此,如果您转到该页面并点击底部的大播放按钮,则应加载滑雪板视频。这也是我需要访问的iframe被加载的时候。基本上我的测试是尝试点击播放器暂停按钮,但该按钮存在于iframe中,我无法将焦点切换到。该按钮存在于页面上的第三个iframe中。

<iframe width="640" height="360" frameborder="0" scrolling="no" allowfullscreen="true" style="position: absolute; z-index: 10; left: 0px; top: 0px;"></iframe>

在webdriver.io中,将焦点切换为iframe的方法是使用browser.frame($('iframe[frameborder^="0"]').value); 当我运行此行时,没有报告错误或任何指示命令失败但如果我在运行此行后检查iframe上下文,我可以看到我仍然在文档根上下文而不是我需要的iframe内部。

幸运的是webdriver.io有一些非常好的调试工具,我可以确切地看到我想要的iframe的value属性中包含的内容。问题是ELEMENT属性报告为未定义。

{ sessionId: 'D2CA7027-4DBC-41E9-8D2B-30CEC88C9D34',
  value:
   [ { ELEMENT: undefined,
       'element-6066-11e4-a52e-4f735466cecf': undefined } ],
  selector: 'iframe[frameborder^="0"]',
  _status: 0 }

如果我在chrome或firefox中运行完全相同的测试,ELEMENT属性有一个值,并且切换到框架在这两个浏览器中都有效。

铬:

{ sessionId: 'a7b6ed418a8dbb7e36e907170c22bd84',
  value:
   [ { ELEMENT: '0.797140656478291-3',
       'element-6066-11e4-a52e-4f735466cecf': '0.797140656478291-3',
       selector: 'iframe[frameborder^="0"]',
       value: [Object],
       index: 0 } ],
  selector: 'iframe[frameborder^="0"]',
  _status: 0 }

火狐:

{ state: 'success',
  sessionId: null,
  hCode: 371926366,
  value:
   [ { ELEMENT: '92627ad9-d151-4749-91f6-58e89de5844c',
       'element-6066-11e4-a52e-4f735466cecf': '92627ad9-d151-4749-91f6-58e89de5844c',
       selector: 'iframe[frameborder^="0"]',
       value: [Object],
       index: 0 } ],
  class: 'org.openqa.selenium.remote.Response',
  selector: 'iframe[frameborder^="0"]',
  _status: 0 }

我假设每个浏览器selenium驱动程序都会处理这个元素对象的选择和创建,这让我觉得safari驱动程序中存在一个错误。我已经用苹果打开了一个错误/问题报告,但它已经有5个多月了,但仍然没有修复,所以我不得不开始向下看其他途径。

任何有关能够成功选择并切换到所需iframe的解决方案的建议都将非常感激。谢谢。

1 个答案:

答案 0 :(得分:0)

通过将焦点放在iFrame之前的某个元素上,然后模拟按下TAB键(将焦点放在iFrame中),我能够完成类似的操作:

$("input[name='discount']").click();
browser.keys("Tab");                  //press the 'TAB' key
//focus is now on the input in an iframe
browser.keys("4242424242424242");     //type into the iFrame's input

http://webdriver.io/api/protocol/keys.html