2

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

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

但它在执行单击命令后挂在第一行,因为该命令关闭框架。然后我改成这个(我在页面上有 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();

但前提是你不考虑它是不稳定的——可能会出现一些时间问题。

那么可能会质疑是否有更清洁和更稳定的方式从封闭框架中切换出来?

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

更新:

我意识到我错了。此问题不适用于所有 iframe。当使用 tinyMCE 弹出窗口时会发生这种情况。情况和这个话题一模一样。所以我怀疑我会在这里找到答案,但谁知道呢。上述解决方案会有所帮助,但时间很短,这意味着几秒钟后 chromedriver 将挂起下一个命令。

4

2 回答 2

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

希望这可以帮助

于 2012-08-07T20:52:03.623 回答
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);
    }
}

}());

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

于 2012-08-08T10:13:52.213 回答