【问题标题】:Click in OK button inside an Alert (Selenium IDE)单击警报内的确定按钮(Selenium IDE)
【发布时间】:2010-11-23 20:26:27
【问题描述】:

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

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

【问题讨论】:

    标签: selenium alert selenium-ide


    【解决方案1】:

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

    【讨论】:

    • 理论上可以,但实际上 Selenium IDE 3.17 在 Windows 10 平台上处理 Chrome 警报时仍然存在问题。
    • 我尝试使用 Chrome/Chromium(Windows 10 上的版本 90.0.4402.0),Selenium IDE 3.17 记录的解决方案如下: - 在下一个提示上回答 - 断言提示 - 在可见提示上回答 webdriver - 点击@al-sargent 提及是正确的
    【解决方案2】:

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

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

    webdriver 在可见确认时选择确定

    描述于:

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

    还有其他与警报相关的 API 调用;只需在该页面上搜索 alert

    【讨论】:

    • 这似乎仍然不适用于 Windows 中的 Chrome。
    【解决方案3】:

    这是 Python 代码
    警报框的问题(特别是甜蜜警报是它们有一个 延迟和 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()
    

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

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

        弹出对话框

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

        Java

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

        红宝石

        driver.switch_to.alert
        

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

        【讨论】:

        • selenium ide 有什么办法吗?
        • 此答案不适用于帖子中询问的 IDE。
        • 标题是 Selenium IDE
        【解决方案6】:

        如果您使用 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")   |
        

        【讨论】:

          【解决方案7】:

          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());
          

          【讨论】:

            【解决方案8】:

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


            如果您使用的是 Selenium RC,并且实际上可以看到一个警告对话框,那么它就无法完成。 Selenium 应该为您处理它。但是,as stated in Selenium documentation:

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

            这是 Selenium RC(因此也是 Selenium IDE)的一个已知限制,也是开发 Selenium 2 (WebDriver) 的原因之一。如果你想处理onload JS 警报,你需要to use WebDriver alert handling

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

            Robot 将所有有用的键映射到常量,所以这很容易。对于keyPressNative(),您希望使用10 作为按Enter27 的值来表示Esc,因为它适用于ASCII codes

            【讨论】:

              【解决方案9】:

              点击警告框中的“确定”按钮:

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

              【讨论】:

                【解决方案10】:

                使用 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);
                ...
                

                【讨论】:

                  【解决方案11】:

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

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

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

                  【讨论】:

                  • AutoIT 不适用于所有浏览器,因为例如对于 Opera(或 AFAIK 新 Firefox),警报框不是系统窗口/控件,而是浏览器呈现的自定义图形元素,所以 AutoIt 无法检测或点击它。
                  • true 表示无法到达加载警报。与安全 AutoAuth 警告相同,但在 Linux 上。
                  • OP 指定 Selenium IDE 而不仅仅是 Selenium
                  【解决方案12】:

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

                   javascript:alert();
                  

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

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

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

                  Vamyip

                  【讨论】:

                    【解决方案13】:

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

                    【讨论】:

                      【解决方案14】:

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

                      【讨论】:

                        猜你喜欢
                        • 2020-09-03
                        • 2019-06-23
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2013-08-29
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多