【问题标题】:Continue execution in Cucumber in case of any errors如果出现任何错误,请继续在 Cucumber 中执行
【发布时间】:2016-06-29 17:54:16
【问题描述】:

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

例如意外弹出窗口

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

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

【问题讨论】:

  • 自动化测试的重点不就是发现意外错误吗?您可以rescue 步骤定义中的异常,但这不是标准 BDD。这是一个可能有帮助的例子:stackoverflow.com/questions/26761624/…
  • 如果你能举个例子可能会有所帮助。通常,错误会阻止您完成场景的其余部分,因此不清楚您要恢复什么。我可以看到想要继续的一个场景是,如果您在同一场景中有一系列断言(但我不确定这是否被视为意外错误)。
  • ok.. 例如.. 我不知道应用程序在什么时候会弹出一个弹出窗口。现在,我想做一些可以关闭弹出窗口并恢复执行的事情。
  • @orde -> 我在步骤定义中处理了少数情况下的异常。但是我不能为每个代码编写一个开始救援块来处理意外情况。
  • @yudi2312,当您说弹出窗口可以在任何时候发生时,您的字面意思是在用户执行操作时(例如单击链接后)的任意时间点还是随机发生?我问是因为,Watir-Webdriver 有几种不同的机制可以在动作之前/之后执行额外的动作。哪一个有用将取决于对话发生的确切时间。

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


【解决方案1】:

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

【讨论】:

  • 这看起来很有趣,贾斯汀。让我试试这件作品。非常感谢您的回复。
【解决方案2】:

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

【讨论】:

  • 但这将在调用该步骤时执行,对吗?这不是我想要的。我不想把这段代码写在一个地方,让cucumber在ui中有警报时执行它,并在关闭它后继续执行。
  • 是的,只要调用此步骤,就会执行此操作。所以你需要在你期望出现alert/error/popup的地方设置这一步。
  • 是的...这仅在我们知道错误消息可能出现的位置时才有效,但在出现意外警报时无效。
  • 为什么有人想要运行自动化测试并跳过(而不是捕获)意外错误,我没有达到那个目标?
  • 当用户执行操作并且自动化套件正在运行的客户缺少一些后端数据时,应用程序会抛出弹出窗口。该弹出窗口不会影响测试用例的流程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-29
  • 2022-06-18
  • 1970-01-01
  • 1970-01-01
  • 2012-07-20
  • 2013-07-29
  • 1970-01-01
相关资源
最近更新 更多