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

Continue execution in Cucumber in case of any errors

我正在使用 Ruby/Selenium-WebDriver/Cucumber 构建一个自动化套件。我想要实现的是在出现任何意外错误的情况下恢复黄瓜场景。

例如意外弹出窗口

我可能会在应用程序的任何位置看到一个模式对话框。我希望我的代码在异常发生时关闭弹出窗口并恢复执行。

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

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

您可以按照以下步骤进行操作:

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

所以只要有弹出窗口,它就会接受它并继续前进。

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

https://github.com/ModusCreateOrg/cucumber-watir/blob/appium/features/step_definitions/appium_steps.rb

鉴于可以随时打开警报,最好的选择可能是使用 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

请注意,您可以将 close_alerts 方法替换为您已经编写的用于处理警报的任何代码。事件侦听器是 Selenium,这意味着您需要编写 Selenium 代码或将 element/driver 转换为 Watir(示例中就是这样做的)。

创建监听器后,需要在初始化期间将其传递给浏览器:

listener = AlertListener.new
browser = Watir::Browser.new :chrome, :listener => listener