Ruby 如果出现任何错误,请继续在Cucumber中执行

Ruby 如果出现任何错误,请继续在Cucumber中执行,ruby,selenium,selenium-webdriver,cucumber,watir-webdriver,Ruby,Selenium,Selenium Webdriver,Cucumber,Watir Webdriver,我正在使用Ruby/SeleniumWebDriver/Cucumber构建一个自动化套件。我想要实现的是在出现任何意外错误时恢复cucumber场景 例如,用于意外的弹出窗口 我可能会在应用程序中的任何时候得到一个模态对话框。我希望我的代码在异常发生时关闭弹出窗口并继续执行 这样做的目的是,自动化套件将在多个系统上运行多天。除了日志和输出报告之外,不会有任何类型的监视。我不希望这些不必要的异常妨碍执行。您可以通过接受屏幕上弹出的任何警报来实现目标 可以通过以下步骤执行此操作: Given(/^

我正在使用Ruby/SeleniumWebDriver/Cucumber构建一个自动化套件。我想要实现的是在出现任何意外错误时恢复cucumber场景

例如,用于意外的弹出窗口

我可能会在应用程序中的任何时候得到一个模态对话框。我希望我的代码在异常发生时关闭弹出窗口并继续执行


这样做的目的是,自动化套件将在多个系统上运行多天。除了日志和输出报告之外,不会有任何类型的监视。我不希望这些不必要的异常妨碍执行。

您可以通过接受
屏幕上弹出的任何警报来实现目标

可以通过以下步骤执行此操作:

Given(/^I should see the error message and accept it$/) do
  def alert_accept
    end
end

因此,无论何时出现弹出窗口,它都会接受并继续前进

您也可以在此处找到此步骤:


鉴于警报可以随时打开,最好的选择可能是使用
AbstractEventListener
。这允许您在Selenium与浏览器交互之前(或之后)执行操作。这意味着您可以在每次交互之前调用警报关闭代码

示例事件侦听器的定义如下:

class AlertListener < Selenium::WebDriver::Support::AbstractEventListener
  def close_alerts(driver)
    # Assuming you want to handle the dialogs using Watir code instead of Selenium,
    # convert the Selenium::WebDriver to a Watir::Browser
    browser = Watir::Browser.new(driver)

    # Run whatever code you have for handling the dialog instances
    browser.alert.ok if browser.alert.exists?
  end

  def before_change_value_of(element, driver)
    close_alerts(driver)
  end

  def before_click(element, driver)
    close_alerts(driver)
  end

  def before_close(driver)
    close_alerts(driver)
  end

  def before_execute_script(script, driver)
    close_alerts(driver)
  end

  def before_find(by, what, driver)
    close_alerts(driver)
  end

  def before_navigate_back(driver)
    close_alerts(driver)
  end

  def before_navigate_forward(driver)
    close_alerts(driver)
  end

  def before_navigate_to(url, driver)
    close_alerts(driver)
  end

  def before_quit(driver)
    close_alerts(driver)
  end    
end

自动化测试的目的不是发现意外错误吗?您可以
rescue
步骤定义中的异常,但这不是标准的BDD。这里有一个可能会有帮助的例子:如果你能举个例子,可能会有帮助。通常,错误会阻止您完成场景的其余部分,因此不清楚您试图恢复的内容。我可以看到一个想要继续的场景是,如果在同一场景中有一系列断言(但我不确定这是否被视为意外错误)。。例如我不知道应用程序在哪一点抛出弹出窗口。现在,我想做一些可以关闭弹出窗口并恢复执行的事情。@orde->我已经在步骤定义中处理了少数情况下的异常。但我不能为每一个代码编写一个“开始救援”块来处理意外情况。@yudi2312,当你说弹出窗口可以在任何点出现时,你的意思是在任何点,还是在用户采取某个操作(如单击链接后)时随机出现?我这样问是因为,Watir Webdriver有两种不同的机制来执行操作之前/之后的其他操作。哪一个有用取决于对话框的确切出现时间。但是,只要调用了正确的步骤,就会执行该操作?这不是我想要的。我不想在一个地方写这段代码,让cucumber在ui中出现警报时执行它,并在关闭警报后继续执行。是的,每当调用此步骤时都会执行。所以你需要把这个步骤设置在一个你希望出现警告/错误/弹出的地方。是的。。。只有当我们知道错误消息可能发生在何处时,这才起作用,但在出现意外警报的情况下则不起作用。为什么有人希望运行自动测试并跳过(而不是捕获)意外错误,我不明白这个目标的意思?当用户执行某个操作并且自动化套件正在运行的客户缺少一些后端数据时,应用程序会弹出窗口。这个弹出窗口不会影响测试用例的流程。让我试试这个。非常感谢您的回复。
listener = AlertListener.new
browser = Watir::Browser.new :chrome, :listener => listener