selenium
  • tinymce
  • webdriver
  • frame
  • selenium-chromedriver
  • 2012-08-07 67 views 2 likes 
    2

    我正在爲某些Web應用程序創建自動化測試。這個應用程序非常複雜。實際上它是特定內容的文本編輯器。作爲功​​能的一部分,它有一些彈出式框架。你可以打開這個彈出窗口?進行一些更改並保存 - 關閉當前幀。可能問題在於,位於框架內的關閉按鈕將被消除。這迫使Chrome WebDriver掛起。我的第一次嘗試是這樣的:Chrome WebDriver在當前選定框架關閉時運行

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

    但hungs上executinh點擊命令,該命令關閉幀後第一線。 後來我改成這樣(我有JQuery的頁面上):

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

    但是這會導致同樣的結果。 然後我用這個解決方案:

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

    它hungs在第二行。只有這個解決方案有效:

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

    但是隻有當你不考慮時,它是不穩定的 - 可能會出現一些時間問題。

    因此,可能問題是否有更清潔和更穩定的方法從閉合框架切換出來?

    P.S .: executeScript - 自定義函數來減少代碼量。它只是在頁面上執行一些js。

    更新:

    我意識到我錯了。這個問題不適用於所有的iframe。當使用tinyMCE彈出窗口時會出現這種情況。情況與this topic完全相同。所以我很懷疑我會在這裏找到答案,但誰知道。上述解決方案將有所幫助,但只有很短的時間,這意味着幾秒鐘後,chromedriver會掛在下一個命令上。

    回答

    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 注意。上面的代碼應該添加到父框架中,而不是添加到彈出框架中。

    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 
    

    希望這有助於

    +0

    對不起,該問題的描述並不完整。 – Dmitry 2012-08-08 08:42:19

    相關問題