Capybara / Ruby - 出现错误时尝试 return 到循环开头

Capybara / Ruby - Trying to return to the beginning of the loop when an error shows up

我正在尝试 return 当错误显示为以下代码时开始循环。

我在使用命令 "next" 时出现偶然错误,但它不会在循环开始时返回。

describe 'Test', :test do

before(:each) do
    visit '/admin'
end


it 'Adding new images' do

    image = 'barcelona.jpg'

    @imagem = Dir.pwd + '/spec/fixtures/' + image

    produto = '1'

    100.times do

        visit '/admin/' + produto

        if page.has_no_css?('#mensagem > h1')

                within_frame(:xpath, "//*[@id='app-content']/main/div/iframe") do

                    find('#ctl00_Conteudo_tbxNome_txtId').set 'test_name'
                    find('#ctl00_Conteudo_BtnSalvar').click

                    if page.has_no_css?('#mensagem > h1')

                        find('#ctl00_Conteudo_tbxIdArquivoControle_lnkInserirArquivo').click

                        attach_file('ctl00_Conteudo_tbxIdArquivoControle_tbxArquivo', @imagem) 
                        find('#ctl00_Conteudo_tbxIdArquivoControle_btnEnviar').click

                        if page.has_no_css?('#mensagem > h1')

                            find('#skuTabNavigation a[href="#tabImages"]').click
                            expect(page).to have_content image

                            puts 'Test ok'

                        else
                            puts 'Error was presented, starting over..'
                            next
                        end

                    else
                        puts 'Error was presented, starting over..'
                        next
                    end
                end
        else
            puts 'Error was presented, starting over..'
            next
        end
    end
end
end

我希望每次系统进入 "else" 状态时,它都会重新启动循环。

我认为没有直接的方法可以返回到循环的初始迭代。 redo 存在,但它只会让您回到当前迭代。

在这种情况下,您可能想要更改循环方式,以便更轻松地控制何时 start/stop。例如:

i = 0

while i <= 100 do
  if page.has_no_css?('#mensagem > h1')
    i = 0
    puts 'Error'
    next
  end

  i += 1
end

因此您不必每次都可以重新设置循环索引并调用 puts 来挽救错误:

class MyError < StandardError; end
i = 0

while i <= 100 do
  begin
    if page.has_no_css?('#mensagem > h1')
      raise MyError, 'thing was missing'
    end

    puts i
    i += 1
  rescue MyError => boom
    puts "Error: #{boom.message}"
    i = 0
    redo
  end
end