当前位置: 首页 > 知识库问答 >
问题:

在ChromeDriver和Chrome with Selenium中对未处理警报的处理有变化吗?

都阳辉
2023-03-14

“没有这样的警觉”。

发生的情况是,它单击一个按钮,并在以下情况下等待警报:

 try {
    button.click();
 } catch (UnhandledAlertException ex) {
   // nothing
 }

 // then here goes code to accept the alert and get the text

当我穿过时,我看到了警报。当我运行它时,我看到警报,但它消失了。我在(Chrome Driver)发布说明中读到了一些关于意外警报的内容,但有点模糊。

 // Somewhere after web page retrieved this gets called:

public void setIgnoreAlert() {
    ChromeDriver cd = (ChromeDriver) driver;
    ChromeOptions cap = new ChromeOptions();
    cap.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.IGNORE);
    Capabilities other = cap;
    cd.getCapabilities().merge(other);
 }

方法configPage.getAndHandleAlertPopup()执行以下操作:

public String getAndHandleAlertPopUp() {
    Alert alert = driver.switchTo().alert();
    String alertPopup = alert.getText();
    alert.accept();
    return alertPopup;
}

共有1个答案

公孙宸
2023-03-14

你没看错。根据WebDriver-W3C建议中的用户提示部分:

用户提示的共同特点是它们是模态窗口,要求用户在取消事件循环并将控制返回到当前顶级浏览上下文之前与它们进行交互。

默认情况下,除非定义了用户提示处理程序,否则不会自动处理用户提示。当出现用户提示时,处理它是后续命令的任务。如果随后请求的命令不是本章中列出的命令,则将返回意外的警报打开错误。

显然,ChromeDriver不符合该标准,因为@test是用@NotyeTimPlemented注释的,如下所示:

  @Test
  @NotYetImplemented(CHROME)
  @NotYetImplemented(CHROMIUMEDGE)
  @Ignore(value = HTMLUNIT, reason = "https://github.com/SeleniumHQ/htmlunit-driver/issues/57")
  @NotYetImplemented(value = MARIONETTE,
      reason = "https://bugzilla.mozilla.org/show_bug.cgi?id=1279211")
  @NotYetImplemented(EDGE)
  public void testIncludesAlertTextInUnhandledAlertException() {
    driver.get(alertPage("cheese"));

    driver.findElement(By.id("alert")).click();
    wait.until(alertIsPresent());

    assertThatExceptionOfType(UnhandledAlertException.class)
    .isThrownBy(driver::getTitle)
    .withMessageContaining("cheese")
    .satisfies(ex -> assertThat(ex.getAlertText()).isEqualTo("cheese"));
  }

现在这个特性已经在ChromeDriver V76.0中实现了:

解决问题2869:ChromeDriver应在未处理的警报错误响应中返回用户提示(或警报)文本[Pri-2]

new WebDriverWait(driver, 10).until(ExpectedConditions.alertIsPresent());
public void setIgnoreAlert() {
    ChromeOptions opt = new ChromeOptions();
    opt.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.IGNORE);
}

另一种观点是禁用beforeunload事件处理程序,您可以在以下内容中找到一些相关的讨论:

  • 如何禁用“重新加载站点?您所做的更改可能无法保存“chrome中(python)selenium测试的弹出窗口?
  • 如何通过Selenium处理Internet Explorer弹出的“您确定要离开此页吗?”

注意:初始化WebDriver和Web Browser实例后,您将无法在运行中更改配置。即使您能够从浏览会话中提取会话IDcookies以及其他功能和会话属性,您仍然无法更改WebDriver的这些属性。

 类似资料:
  • 我面临一个问题,其中我得到一个异常说UnhandledAlertException模态对话框存在,下面是一些痕迹 组织。openqa。硒。未处理的AlertException:存在模式对话框:此页面要求您确认是否要离开-您输入的数据可能不会保存。构建信息:版本:“2.41.0”,版本:“3192D8A6C4449DC285928BA02479344F5423C58”,时间:“2014-03-27

  • 我主要是为技术精明的人编写一个小工具,例如程序员、工程师等,因为这些工具通常是快速的,随着时间的推移,我知道会有未处理的异常,用户不会介意。我希望用户能够向我发送回溯,这样我就可以检查发生了什么,并可能改进应用程序。 我通常做wxPython编程,但我最近做了一些Java。我已经将

  • 问题内容: 在selenium框架2.25中,我看到我们具有UnexpectedAlertBehaviour枚举类型,但我不知道如何使用它。 问题答案: 我发现了有关您的问题的文档的这一部分:这对其他人也可能有用: v2.25.0 ======= WebDriver: 添加了用于处理BASIC和DIGEST身份验证的API 对话。目前尚未在任何驱动程序中实现。 警告用户IE驱动程序将不再使用DLL

  • 本文向大家介绍如何在Selenium中处理基于Web的警报?,包括了如何在Selenium中处理基于Web的警报?的使用技巧和注意事项,需要的朋友参考一下 Selenium WebDriver借助Alert界面提供了多个API来处理弹出窗口或警报。 解雇() 这将取消警报按钮。 接受() 这将接受警报按钮。 getText() 这将提取警报文本。 sendKeys() 这将在警报框中输入文本。 示

  • 本文档介绍 DM 中各主要告警信息的处理方法。 高可用告警 DM_worker_offline 存在离线的 DM-worker 超过一小时会触发该告警。在高可用架构下,该告警可能不会直接中断任务,但是会提升任务中断的风险。处理告警可以查看对应 DM-worker 节点的工作状态,检查是否连通,并通过日志排查错误。 DM_DDL_error 处理 shard DDL 时出现错误,此时需要参考 DM

  • 我正在使用Flink CEP,我需要处理甚至不生成警报的事件。请问我该怎么做? 我正在使用rabbitMq中的事件,并定义了一些模式。现在我需要做的是将另一个队列中接收到的所有事件发送到一个远程API。我是Flink的新手,所以我遵循了文档中的示例。当我在将接收到的事件与定义的模式进行匹配后尝试发送它们时,我只会得到与模式匹配的结果。例如,我想做的就是在我的事件中将一个属性设置为true,然后将它

  • 问题内容: 我想检测是否弹出警报。目前,我正在使用以下代码: 问题是,如果网页的当前状态没有警报,它将等待特定的时间,直到达到超时,然后引发异常,因此性能真的很差。 有没有更好的方法,也许可以将警报事件处理程序用于动态发生的警报? 问题答案: 这是使用“从此处进行显式等待”对我有用的WebDriver:高级用法

  • 在浏览器中是否有任何函数/类来处理警告或任何其他类型的弹出窗口。我正在处理一个弹出警告,我知道我可以通过使用< code>driver.switchto()来处理它。alert();并执行进一步的操作。既然serenity BDD非常适合处理元素,那么是否有任何特定的函数来处理警报(仅通过使用Serenity BDD函数)。