如果有任何错误,请继续在Cucumber中执行

时间:2016-06-29 17:54:17

标签: ruby selenium selenium-webdriver cucumber watir-webdriver

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

例如意外的弹出窗口

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

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

2 个答案:

答案 0 :(得分:2)

鉴于警报可以随时打开,最好的选择可能是使用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代码或将元素/驱动程序转换为Watir(这是示例中所做的)。

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

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

答案 1 :(得分:0)

您可以通过接受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