Selenium WebDriver(Selenium 2)中处理警告

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

如何点击警告框?

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

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

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我顶  (TRANS: Let me promote this post!)

我稍微重新格式化了你的代码。能否翻译一下中文标志?也许它们揭示了一些信息。 - GvS
7个回答

12

截至最新的selenium 2版本,可以通过FirefoxDriver实现此操作:

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

我喜欢这个解决方案,它在我的代码中很好地工作。我正在使用Firefox,我没有在其他浏览器上尝试过这段代码。 - Ripon Al Wasim
在Selenium WebDriver源代码文件中,我在哪里可以看到alert.getAlertText的源代码实现? - rahoolm
@rahoolm 请查看此处 https://github.com/SeleniumHQ/selenium/blob/ceaf3da79542024becdda5953059dfbb96fb3a90/java/server/src/org/openqa/selenium/remote/server/handler/GetAlertText.java - aaron0207

4
在Selenium 2中,目前仅支持在Firefox浏览器中处理警报。您没有说明测试使用的语言,但以下是使用ruby处理警报的方法(摘自selenium wiki上的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

4

在Selenium 2的早期版本中,我只能通过覆盖Javascript中的window.alert来处理Internet Explorer中的警告:

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
}

Selenium 2.0b3支持在IE和Firefox中处理警报,因此您可以执行以下操作:

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

然而,我尝试使用Yes/No警告时无法使上述方法起作用(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();

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
      }  

捕获此异常,然后您可以相应地接受或拒绝警报。

这可能是可行的,但也取决于程序的目的。我使用Selenium Webdriver进行内部集成测试和爬取外部网站。在测试情况下,这将隐藏意外的程序状态,这我认为是不好的 - 而在爬取网站时,它可能只是帮助我避免了别人糟糕的可用性决策。 - Joel Purra

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

如果您想取消弹出窗口,请使用以下方法:
 alert.dismiss();

替代

 alert.accept():

1

C# 代码:

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

“Alert” 和 “IAlert” 有什么区别? - Ripon Al Wasim
我不确定。你可以先在这里看一下:http://selenium.googlecode.com/svn/trunk/docs/api/dotnet/index.html - Entree
展开“OpenQA.Selenium命名空间”>展开“IAlert接口”。 - Entree

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接