当前选定的框架关闭时,Chrome WebDriver会挂起

时间:2012-08-07 12:45:59

标签: selenium tinymce webdriver frame selenium-chromedriver

我正在为一些Web应用程序创建自动化测试。这个应用程序非常复杂。实际上它是特定内容的文本编辑器。作为功​​能的一部分,它有一些弹出框架。你可以打开这个弹出窗口吗?进行一些更改并保存它们 - 关闭当前帧。可能问题在于,位于框架内的关闭按钮将被消除。而这迫使Chrome WebDriver挂起。我的第一次尝试是这样的:

    driver.findElement(By.xpath("//input[@id='insert']")).click();
    driver.switchTo().defaultContent();

但是在执行clickinh click命令之后,它挂在第一行作为此命令关闭帧。 然后我改为这个(我在页面上有JQuery):

    driver.executeScript("$(\"input#insert\").click()");
    driver.switchTo().defaultContent();

但这会导致相同的结果。 然后我使用这个解决方案:

    driver.executeScript("setTimeout(function(){$(\"input#insert\").click()}, 10)");
    driver.switchTo().defaultContent();

它挂在第二行。只有这个解决方案有效:

    driver.executeScript("setTimeout(function(){$(\"input#insert\").click()}, 100)");
    driver.switchTo().defaultContent();

但是,只有当你不考虑它,它是不稳定的 - 可能会出现一些时间问题。

所以可能有问题是从封闭的框架中切换出更清洁,更稳定的方式吗?

P.S。:executeScript - 自定义函数以减少代码量。它只是在页面上执行一些js。

更新

我意识到我错了。此问题并非适用于所有iframe。当使用tinyMCE弹出窗口时会发生这种情况。情况与this topic中的情况完全相同。所以我在这里找到答案是值得怀疑的,但谁知道呢。上面描述的解决方案会有所帮助,但只能在很短的时间内完成,这意味着经过几秒钟后,chromedriver会挂起下一个命令。

2 个答案:

答案 0 :(得分:0)

这就是我在Ruby中的表现,希望你能为java改变它

$driver.find_element(:xpath, "//input[@id='insert']").click
$wait.until {$driver.window_handles.size < 2} #this will "explicitly wait" for the window to close
handles = $driver.window_handles #get available window handles
$driver.switch_to.window(handles[0]) #navigate to default in this case the First window handle

希望这会有所帮助

答案 1 :(得分:0)

问题在于这行tinyMCEPopup代码:

   DOM.setAttrib(id + '_ifr', 'src', 'javascript:""'); // Prevent leak

在页面上执行此脚本修复挂起问题(但可能会造成泄漏:)):

(function() {
var domVar;
if (window.tinymce && window.tinymce.DOM) {
    domVar = window.tinymce.DOM 
}
else if (window.tinyMCE && window.tinyMCE.DOM) {
    domVar = window.tinyMCE.DOM 
}
else {
    return;
}
var tempVar = domVar.setAttrib;console.log(123)
domVar.setAttrib = function(id, attr, val) {
    if (attr == 'src' && typeof(val)== 'string' &&(val + "").trim().match(/javascript\s*:\s*("\s*"|'\s*')/)) {
        console.log("Cool");
        return;
    }
    else {
        tempVar.apply(this, arguments);
    }
}

}());

错误和解决方案也描述了here 注意。上面的代码应该添加到父框架中,而不是添加到弹出框架中。