70

我需要使用Selenium命令单击警报窗口内的“确定”按钮。我试过了assertAlertverifyAlert但他们没有做我想做的事。

是否可以单击“确定”按钮?如果是这样,有人可以为我提供 Selenium IDE 命令的示例吗?

4

14 回答 14

54

试试 Selenium 2.0b1。它的核心与第一个版本不同。根据文档,它应该支持弹出对话框:

弹出对话框

从 Selenium 2.0 beta 1 开始,内置了对处理弹出对话框的支持。在您触发并执行将打开弹出窗口的操作后,您可以使用以下命令访问警报:

爪哇

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

红宝石

driver.switch_to.alert

这将返回当前打开的警报对象。有了这个对象,您现在可以接受、关闭、阅读它的内容,甚至可以输入提示。此界面在警报、确认、提示方面同样适用。有关更多信息,请参阅 JavaDocs。

于 2011-02-08T14:17:29.600 回答
44

要单击警报框中的“确定”按钮:

driver.switchTo().alert().accept();
于 2011-02-22T07:47:17.580 回答
10

这是 2012 年的答案,如果是 2009 年的问题,但人们仍然在看它,只有一个正确(使用WebDriver)和一个几乎有用(但不够好)的答案。


如果您正在使用 Selenium RC 并且实际上可以看到一个警报对话框,那么它就无法完成。Selenium 应该为您处理它。但是,正如 Selenium 文档中所述

Selenium 尝试向您隐藏这些对话框(通过替换 window.alert、window.confirm 和 window.prompt),这样它们就不会停止执行您的页面。如果您看到一个警报弹出窗口,可能是因为它在页面加载过程中触发了,这对于我们来说保护页面通常还为时过早。

这是 Selenium RC(因此也是 Selenium IDE)的一个已知限制,也是开发 Selenium 2 (WebDriver) 的原因之一。如果要处理onloadJS 警报,则需要使用 WebDriver 警报处理

也就是说,您可以使用Robotselenium.keyPressNative()填写任何文本,然后Enter盲目地按下并确认对话框。这不是最干净的方法,但它可以工作。但是,您将无法收到该alert消息。

Robot将所有有用的键映射到常量,所以这很容易。使用keyPressNative(), 您希望将10其用作 pressEnter27for的值,Esc因为它适用于ASCII 代码

于 2012-05-25T10:01:36.643 回答
4

如果您使用 selenium IDE,则必须手动单击 Ok 按钮,因为当警报消息命令运行时,浏览器停止工作,如果您想自动单击 ok 按钮,则必须使用 selenium RC 或 webdriver,以下命令适用于 Selenium IDE

在 selenium ide 使用storeeval命令中,不同类型的框

    storeEval | alert("This is alert box")                           |
    storeEval | prompt("This is prompt box. Please enter the value") | text
    storeEval | confirm("this is cofirm box")   |
于 2013-03-21T08:56:53.970 回答
4

1| 打印警报弹出文本并关闭 -I

Alert alert = driver.switchTo().alert();
System.out.println(closeAlertAndGetItsText());

2| 打印警报弹出文本并关闭 -II

Alert alert = driver.switchTo().alert();
System.out.println(alert.getText()); //Print Alert popup
alert.accept(); //Close Alert popup

3| 断言警报弹出文本并关闭

Alert alert = driver.switchTo().alert();
assertEquals("Expected Value", closeAlertAndGetItsText());
于 2013-10-29T09:31:22.663 回答
2

您可能会查看chooseOkOnNextConfirmation,尽管如果我正确阅读了文档,这可能是默认行为。

于 2009-08-28T19:39:04.550 回答
2

问题不清楚 - 这是为了在页面加载时发出警报吗?使用 Selenium 时,您不应该看到任何警报对话框,因为它替换alert()为自己的版本,该版本仅捕获为验证而提供的消息。

Selenium 不支持alert()页面加载,因为它需要使用自己的版本修补被测窗口中的功能。

如果您无法摆脱来自被测应用程序的加载警报,您应该考虑使用 GUI 自动化来单击生成的弹出窗口,例如,如果您在 Windows 上,则为 AutoIT 。

于 2011-02-08T11:28:12.957 回答
2

使用警报界面,首先switchTo()发出警报,然后使用accept()单击确定或使用dismiss()取消它

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

或者

Alert alert_box = driver.switchTo().alert();
alert_box.dismiss(); 
于 2017-09-27T09:36:24.627 回答
1

关于 Selenium IDE,我不是专家,但您必须在触发警报/确认对话框的事件之前添加“在下次确认时选择确定”行,如您在此屏幕截图中看到的那样:

Selenium IDE 订单问题

于 2020-07-02T17:26:52.460 回答
0

assertAlert 应该可以解决问题。我在文档中看到页面的 OnLoad 事件处理程序中生成的警报不能以这种方式编写脚本(唉,由于 ASP.NET 页面生命周期,我自己也经历过)。这可能是你遇到的吗?

于 2009-11-10T16:30:36.860 回答
0

对于 selenium,警报是使用 javascript 引发的警报,例如

 javascript:alert();

有一项基本检查可以验证您的警报实际上是 javascript 警报还是只是用于显示某些消息的基于 div 的框。如果它是一个 javascript 警报,您将无法在运行 selenium 脚本时在屏幕上看到它。

如果您能够看到它,那么您需要获取警报的确定按钮的定位器并使用 selenium.click(locator) 来关闭警报。如果您可以提供更多上下文,可以更好地帮助您:

  1. IDE还是RC?
  2. 警报的 HTML 代码
  3. 你的硒脚本。

瓦米普

于 2011-02-08T09:53:40.120 回答
0

使用 chooseOkOnNextConfirmation() 关闭警报并使用 getAlert() 验证它是否已显示(并可选择获取其文本进行验证)。

selenium.chooseOkOnNextConfirmation();  // prepares Selenium to handle next alert
selenium.click(locator);
String alertText = selenium.getAlert(); // verifies that alert was shown
assertEquals("This is a popup window", alertText);
...
于 2011-08-16T19:38:13.057 回答
0

新的 Selenium IDE(2019 年发布)具有更广泛的 API 和新文档。

我相信这是您要尝试的命令:

webdriver 在可见确认中选择 ok

描述于:

https://www.seleniumhq.org/selenium-ide/docs/en/api/commands/#webdriver-choose-ok-on-visible-confirmation

还有其他与警报相关的 API 调用;只需搜索该页面以获取警报

于 2019-03-03T06:18:03.110 回答
0

这是警报框的 Pythoncode
问题(特别是甜蜜警报是它们有延迟并且 Selenium 太快了)

对我有用的选项是:

while True:
    try:
        driver.find_element_by_xpath('//div[@class="sweet-alert showSweetAlert visible"]')
        break
    except:
        wait = WebDriverWait(driver, 1000)

confirm_button = driver.find_element_by_xpath('//button[@class="confirm"]')
confirm_button.click()
于 2018-04-03T08:41:41.260 回答