Chrome 网络驱动程序在当前所选框架关闭时挂起



我正在为一些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();

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

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

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

更新:

意识到我错了。此问题并非适用于所有 iframe。当使用微小的MCE弹出窗口时,就会发生这种情况。情况与本主题中的一模一样。所以我会在这里找到答案是值得怀疑的,但谁知道呢。上述解决方案会有所帮助,但时间很短,这意味着几秒钟后 chromedriver 将在下一个命令上挂起。

这就是我在 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

希望这有帮助

问题出在 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(/javascripts*:s*("s*"|'s*')/)) {
        console.log("Cool");
        return;
    }
    else {
        tempVar.apply(this, arguments);
    }
}
}());

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

最新更新