我正在使用webdriver.io编写自动化E2E测试但是我在尝试在safari上运行测试时遇到了麻烦。我试图测试的页面上有一堆不同的iframe,我需要能够在所有这些iframe之间切换焦点来访问我需要的元素。我遇到的问题是,在safari中,如果一个帧是动态加载的(没有与页面同时加载),我无法将焦点切换到该帧。我使用的测试套件在Chrome和Firefox上运行良好,我只在safari中看到这个问题。我假设这是与浏览器捆绑在一起的Safari驱动程序中的一个错误,但我在这个问题上没有得到苹果支持的好运。我希望有一种方法可以解决这个问题,而无需苹果的修复。
因此,如果您转到该页面并点击底部的大播放按钮,则应加载滑雪板视频。这也是我需要访问的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的解决方案的建议都将非常感激。谢谢。
答案 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