2016-09-20 67 views
0

我有幾個表單使用jQuery Dirty Forms插件在用戶嘗試導航之前提醒用戶。Selenium導航返回和jQuery髒表單插件

直到Chrome 52,我才能夠運行Selenium插件引發的警報測試。我打電話driver.Navigate().Back();,這會觸發一個警告框。然後,我可以使用下面的代碼處理警報:

d.Navigate().Back(); 

try 
{ 
    // Expecting an alert now 
    IAlert a = d.SwitchTo().Alert(); 

    // And acknowledge the alert (equivalent to clicking "OK") 
    a.Accept(); 
} 
catch (NoAlertPresentException ex) 
{ 
    System.Diagnostics.Debug.Write($"Warning: Expected an alert but none was present. {ex.Message}"); 
} 

然而,由於鉻52的.Back()行爲似乎已經改變了。現在,一個InvalidOperationException拋出與消息

unknown error: cannot determine loading status
from unexpected alert open
(Session info: chrome=53.0.2785.116)
(Driver info: chromedriver=2.24.417431 (9aea000394714d2fbb20850021f6204f2256b9cf),platform=Windows NT 10.0.10586 x86_64)

我在這個時候拋棄異常,但由於警報的下一次測試將無法運行。特別是,這意味着我不能順序運行多個測試。我必須單獨運行每個測試,手動確認提醒,以便Chrome將關閉

我在最新版本的Selenium(2.53.1)上試過ChromeDriver 2.22/23/24。所有人都有相同的行爲。

我知道這裏沒有人可以控制Chrome,但我想知道是否有替代方案可以用來實現這個測試目標,以確保髒表單警報出現。由於其他問題,我無法從Chrome更改爲其他瀏覽器。提交表單也是我不想做的事情(如果髒表單沒有被觸發,它會修改數據庫,我不想爲此工作)。

更新:2016年9月22日

我工作圍繞這一問題用下面的代碼現在。

try 
{ 
    // Navigate back to the previous page 
    d.Navigate().Back(); 

    try 
    { 
     IAlert a = d.SwitchTo().Alert(); 

     // Get the text of the alert or prompt 
     System.Diagnostics.Debug.WriteLine(a.Text); 
     // And acknowledge the alert (equivalent to clicking "OK") 
     a.Accept(); 
    } 
    catch (NoAlertPresentException ex) 
    { 
     System.Diagnostics.Debug.Write($"Warning: Expected an alert but none was present. {ex.Message}"); 
    } 
} 
// Chrome 52: this is how the driver does it now? 
catch (InvalidOperationException ex) 
{ 
    if (!ex.Message.Contains("unexpected alert")) 
     throw; 

    IAlert a = d.SwitchTo().Alert(); 
    Assert.IsTrue(a.Text.Contains("lose these changes")); 

    a.Accept(); 

    System.Diagnostics.Debug.WriteLine("Handled alert through InvalidOperationException handler."); 
} 

回答

0

隨着ChromeDriver 2.29的發佈,這個問題已得到解決。根據ChromeDriver發行說明:

Fixes a bug that interferes with handling the alert dialog on page unload.

我現在正在運行Chrome 58,並且已更新到最新的Selenium庫(3.4.0)。我原來使用的代碼(來自原始帖子)現在可以再次運行。

原始代碼複製以供參考:

d.Navigate().Back(); 

try 
{ 
    // Expecting an alert now 
    IAlert a = d.SwitchTo().Alert(); 

    // And acknowledge the alert (equivalent to clicking "OK") 
    a.Accept(); 
} 
catch (NoAlertPresentException ex) 
{ 
    System.Diagnostics.Debug.Write($"Warning: Expected an alert but none was present. {ex.Message}"); 
}