如何处理无法加载并继续在Watir-Webdriver中测试的页面

时间:2012-03-02 20:58:09

标签: ruby watir watir-webdriver

我在其他问题上寻找答案,但我找不到答案。

我的问题是我需要测试一些结果,但是当我点击没有加载页面的Url时,我的脚本会一直失败。以下Url无法加载。当此Url未加载时,我想继续进行测试。

http://www.mycounciltax.org.uk/results?postcode=WC1N1DF&search=Search

我试过用:

begin
  Timeout::timeout(30) do

    //enter part that is hanging
  end
end

然而剧本就退出了。下面是我正在使用的完整脚本。脚本将超时并退出....

browser.goto "http://www.mycounciltax.org.uk/results?postcode=WC1N1DF&search=Search"

有关如何允许脚本继续(绕过此Url的测试)并转到下一个脚本的任何想法?

require "watir-webdriver"
browser = Watir::Browser.new :ff
browser.goto "http://www.mycounciltax.org.uk/results?postcode=cv5+6bz&search=Search"
content = browser.table.trs.collect {|tr| [tr[0].text, tr[1].text, tr[2].text]}
require 'win32ole'

application = WIN32OLE.new('Excel.Application')
application.visible = TRUE
workbook = application.Workbooks.Add();
worksheet = workbook.Worksheets(1);
worksheet.visible

row = 1; column = 0
content.each do |array|
  array.each do |element|
    worksheet.Cells(1,1).offset(row,column).value = element #.offset(row,column)
    column += 1
  end
  row += 1
  column = 0
end


browser.goto "http://www.mycounciltax.org.uk/results?postcode=WC1N1DP&search=Search"
if browser.table.exists?
  content = browser.table.trs.collect {|tr| [tr[0].text, tr[1].text, tr[2].text]}
  row = 1; column = 0
  content.each do |array|
    array.each do |element|
      worksheet.Cells(1,125).offset(row,column).value = element #.offset(row,column)
      column += 1
    end
    row += 1
    column = 0
  end
else
  content =0
end



browser.goto "http://www.mycounciltax.org.uk/results?postcode=WC1N1DF&search=Search"
if browser.table.exists?
  content = browser.table.trs.collect {|tr| [tr[0].text, tr[1].text, tr[2].text]}
  row = 1; column = 0
  content.each do |array|
    array.each do |element|
      worksheet.Cells(1,130).offset(row,column).value = element #.offset(row,column)
      column += 1
    end
   row += 1
   column = 0
  end
else
  content =0
end


browser.goto "http://www.mycounciltax.org.uk/results?postcode=WC1N1DP&search=Search"
if browser.table.exists?
  content = browser.table.trs.collect {|tr| [tr[0].text, tr[1].text, tr[2].text]}
  row = 1; column = 0
  content.each do |array|
    array.each do |element|
      worksheet.Cells(1,135).offset(row,column).value = element #.offset(row,column)
      column += 1
    end
    row += 1
    column = 0
  end
else
  content =0
end

更新

我的意思是说我想测试每个url是否在执行if else之前加载(将表输出到excel中)。我可以按照这个

的方式做点什么
require "watir-webdriver"
browser = Watir::Browser.new :ff
browser.goto "http://www.mycounciltax.org.uk/results?postcode=cv5+6bz&search=Search"
content = browser.table.trs.collect {|tr| [tr[0].text, tr[1].text, tr[2].text]}
require 'win32ole'

application = WIN32OLE.new('Excel.Application')
application.visible = TRUE
workbook = application.Workbooks.Add();
worksheet = workbook.Worksheets(1);
worksheet.visible

row = 1; column = 0
content.each do |array|
  array.each do |element|
    worksheet.Cells(1,1).offset(row,column).value = element #.offset(row,column)
    column += 1
  end
  row += 1
  column = 0
end

begin
  browser.goto "http://www.mycounciltax.org.uk/results?postcode=WC1N1DP&search=Search"
  if browser.table.exists?
    content = browser.table.trs.collect {|tr| [tr[0].text, tr[1].text, tr[2].text]}
    row = 1; column = 0
    content.each do |array|
      array.each do |element|
        worksheet.Cells(1,125).offset(row,column).value = element #.offset(row,column)
        column += 1
      end
      row += 1
      column = 0
    end
  else
    content =0
  end
rescue => e
  puts "rescued #{e}"
end

begin
  browser.goto "http://www.mycounciltax.org.uk/results?postcode=WC1N1DF&search=Search"
    if browser.table.exists?
      content = browser.table.trs.collect {|tr| [tr[0].text, tr[1].text, tr[2].text]}
      row = 1; column = 0
      content.each do |array|
        array.each do |element|
          worksheet.Cells(1,130).offset(row,column).value = element #.offset(row,column)
          column += 1
        end
       row += 1
       column = 0
     end
  else
    content =0
  end
rescue => e
  puts "rescued #{e}"
end

begin   
  browser.goto "http://www.mycounciltax.org.uk/results?postcode=WC1N1DP&search=Search"
  if browser.table.exists?
    content = browser.table.trs.collect {|tr| [tr[0].text, tr[1].text, tr[2].text]}
    row = 1; column = 0
    content.each do |array|
      array.each do |element|
        worksheet.Cells(1,135).offset(row,column).value = element #.offset(row,column)
        column += 1
      end
      row += 1
      column = 0
    end
  else
     content =0
  end
rescue => e
    puts "rescued #{e}"
end

2 个答案:

答案 0 :(得分:3)

您提出的这个问题,这类问题可能表明您在组织和运行脚本方面存在更大的问题。

我在大多数情况下的第一个建议是使用现有的测试框架,测试/单位黄瓜,健身等。所有这些都是为了将​​测试作为小的原子项运行,如果出现任何问题并报告失败,然后进入下一个测试。 (与大多数自制脚本相反,这些脚本通常是一个巨大的长序列,如果出现问题而无法应对任何意外故障,或者某种处理循环逐步执行文件,并且仍然存在相同类型的问题。我不确定这是否适用于你,因为你似乎正在使用watir进行刮擦而不是测试。

如果您正在推出自己的框架,那么您需要在系统中进行设计。它被称为“异常处理”,基本格式如Zeljko在其答案中所述。 A quick google search会找到关于ruby语言这方面的多个教程。

上面编辑的代码更接近于此,但对我来说看起来很重复。 (虽然因为它现在显示为所有刷新,所以很难理解。所以我编辑它来添加缩进,啊那更好......)我会考虑将你重复三次的东西变成一个接收URL的方法和电子表格位置作为参数,可以减少重复。

另外,您可能会发现在begin / rescue / end中包含少量代码行更有用,以便报告有关失败的更有用的消息。这样您就可以报告“错误加载页面#{url}”之类的内容,您甚至可以将其写入电子表格。

我建议稍微阅读一下错误如何通过系统“冒泡”,以便失败可以提供更多信息。

答案 1 :(得分:1)

我不确定你如何测试一个没有加载的页面,但尝试这样的事情:

begin
  browser.goto "http://www.mycounciltax.org.uk/results?postcode=WC1N1DF&search=Search"
rescue => e
  puts "rescued #{e}"
end