2011-03-02 106 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