2011-03-02 172 views
7
driver.findElement(By.xpath("//input[@value='添加']")).click(); 
//Pops out an Alert and program stops, does not continue 

如何點擊警報?Selenium WebDriver(Selenium 2)的處理警報

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

啊啊啊啊 怎麼沒有人呢? (TRANS: ahahahahaha why there is no one here to reply my post?) 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
我頂 (TRANS: Let me promote this post!) 
+0

我重新格式化了你的代碼。是否可以翻譯中文標誌?也許他們透露一些信息。 – GvS 2011-03-02 09:15:44

+0

嘿,查看我的回答 – Johnydep 2012-09-03 02:55:16

回答

4

在Selenium 2中,當前的警報只能在Firefox瀏覽器中處理。您沒有指定用於測試的語言,但以下是如何使用ruby處理警報。 (這來自硒維基上的Ruby Bindings page)。

JavaScript警告/確認

您可以使用webdriver的處理JavaScript警告和確認對話框。兩者的實現是相同的。

注意:此時API僅在Firefox(或使用遠程服務器的Firefox)中可用,並且僅警報/確認可在捕獲後加載時生成警報。

require "selenium-webdriver" 

driver = Selenium::WebDriver.for :firefox 
driver.navigate.to "http://mysite.com/page_with_alert.html" 

driver.find_element(:name, 'element_with_alert_javascript').click 
a = driver.switch_to.alert 
if a.text == 'A value you are looking for' 
    a.dismiss 
else 
    a.accept 
end 
12

由於採用了最新的硒2發佈的,這是可以做到(至少使用FirefoxDriver):

driver.switchTo().alert().accept(); 
+0

我喜歡這個解決方案,它很好地處理了我的代碼。我正在使用Firefox,我沒有在其他瀏覽器上嘗試此代碼。 – 2012-07-17 07:36:49

+0

我可以在哪裏看到selenium webdriver源代碼文件中的alert.getAlertText的源代碼實現? – rahoolm 2014-03-20 01:08:58

+0

@rahoolm在這裏檢查https://github.com/SeleniumHQ/selenium/blob/ceaf3da79542024becdda5953059dfbb96fb3a90/java/server/src/org/openqa/selenium/remote/server/handler/GetAlertText。java – aaron0207 2017-09-06 07:56:59

4

在以前版本的硒2我別無選擇,要處理的警報Internet Explorer中通過重寫JavaScript中的window.alert:

IJavaScriptExecutor js = (IJavaScriptExecutor)driver; 
// Override window.alert to store the prompt and accept it automatically 
js.ExecuteScript("window.alert = function(msg) { document.bAlert = true; document.lastAlert=msg; }"); 

// Do some stuff... 

// Check for alert 
Object o = js.ExecuteScript("return document.bAlert"); 
if (o != null && (bool)o == true) 
{ 
    //retrieve the alert message 
    o = js.ExecuteScript("return document.lastAlert"); 
    // Do something with the alert text 
} 

硒2.0b3有用於處理在IE和Firefox警報的支持,這樣你就可以做到以下幾點:

IAlert alert = driver.SwitchTo().Alert(); 
// Get the text from the alert 
string alertText = alert.Text; 
// Accept the alert 
alert.Accept(); 

但是,我還沒有能夠得到上面的是/否警報(Dismiss()適用於No,但Accept()不適用於Yes)。我正在查看IEDriver以確定這是爲什麼。

2
IWebDriver driver = new ChromeDriver(); 
driver.Navigate().GoToUrl("http://skynet:8081/1.htm"); 

var selenium = new WebDriverBackedSelenium(driver, driver.Url); 
selenium.Start(); 

selenium.Click("css=input[type=button]"); 

Assert.AreEqual(selenium.GetConfirmation(), "Are you sure?"); 
Assert.AreEqual("OK", selenium.GetAlert()); 

// <input type="button" onclick="if(confirm('Are you sure?')) alert('OK'); else alert('Cancel');" value="Alert test" /> 

driver.Quit(); 
1

C#代碼:

IAlert alert = driver.SwitchTo().Alert(); 
alert.Accept(); 
System.Threading.Thread.Sleep(milliseconds); 
+0

「Alert」和「IAlert」有什麼區別? – 2012-08-10 11:47:26

+0

我不確定。你可以在這裏看看初學者。 http://selenium.googlecode.com/svn/trunk/docs/api/dotnet/index.html – MacGyver 2012-08-10 14:12:52

+0

展開「OpenQA.Selenium命名空間」>展開「IAlert Interface」 – MacGyver 2012-08-10 14:14:09

1
Alert alert = driver.switchTo().alert(); 
alert.accept(); 

如果要取消彈出使用以下命令:

alert.dismiss(); 

代替

alert.accept(): 
2

你將不得不處理異常和運行處理程序代碼的預警,爲Java:

 try{ 
     driver.findElement(By.xpath("//input[@value='添加']")).click(); 
     } catch(org.openqa.selenium.UnhandledAlertException e){ 
     Alert alert = driver.switchTo().alert(); 
     alert.accept(); 
     // you logic here what you want to do next 
     } 

捕獲此異常,然後就可以相應地接受或拒絕的警報。

+0

這可能有用,但它也取決於目的該程序。我使用Selenium Webdriver進行內部集成測試和爬網外部網絡。在測試案例中,這隱藏了一個意想不到的程序狀態,我認爲這是一件壞事 - 當抓取網頁時,它可能會讓我從別人的可用性差的決定中解脫出來。 – 2012-09-06 02:03:38