从没有不同网址的网站中删除结果

时间:2011-11-28 16:58:58

标签: ruby regex automation watir hpricot

我正在尝试使用SayNoTo0870自动搜索其他电话号码。每次搜索备用号码或名称时,都会显示'/companysearch.php'页面。

显然,此页面没有引用,在我看来,您不能只链接到此页面。

我希望做的是使用下面的代码,自动打开浏览器,搜索名称/号码,删除HTML,然后提供前5个结果。我已经将自动化部件关闭,但显然当尝试使用Hpricot保存网页时,它只会显示“抱歉无法找到页面”,因为我无法直接链接到搜索结果页面。

到目前为止,这是我的代码: (我已删除评论以缩短它)

require 'rubygems'
require 'watir'
require 'hpricot'
require 'open-uri'



class OH870


    def searchName(name)
        browser = Watir::Browser.new
        browser.goto 'http://www.saynoto0870.com/search.php'
        browser.text_field(:name => 'search_name').set name
        browser.button(:name => 'submit').click
    end 

    def searchNumber(number)

        browser = Watir::Browser.new
        browser.goto 'http://www.saynoto0870.com/search.php'
        browser.text_field(:name => 'number').set number
        browser.button(:name => 'submit').click
    end 

    def loadNew(website)

        doc = Hpricot(open(website))
        puts(doc)   

    end


    def strip_tags
        stripped = website.gsub( %r{</?[^>]+?>}, '' )
        puts stripped
    end

end # class

class Main < OH870
puts "What is the name of the place you want?" 
website = 'http://www.saynoto0870.com/companysearch.php'

    question = gets.chomp
    whichNumber = OH870.new
    whichNumber.searchName(question)
    #result = OH870.new
    #withoutTags = website.strip_tags
    #result.loadNew(withoutTags)
end

现在我不确定是否有办法“要求watir跟进到companysearch.php页面并转储结果而不必将此页面作为变量传递。

我想知道是否有人在这里有任何建议?

1 个答案:

答案 0 :(得分:2)

使用WATIR,减去无关的库,这里只需要完成你所描述的内容(仅使用'name'测试用例)。我已经把它从函数格式中删除了,因为你已经知道如何做到这一点,这将是一个更清晰的测试用例路径。

require 'watir'

@browser = Watir::Browser.new :firefox   #open a browser called @browser

@browser.goto "http://(your search page here)"         #go to the search page
@browser.text_field(:name => 'name').value = "Awesome" #fill in the 'name' field
@browser.button(:name => 'submit').click               #submit the form

如果一切顺利,我们现在应该查看搜索结果。 WATIR已经知道它在新页面上 - 我们不必指定URL。如果结果在框架中,我们需要在查看其内容之前访问该框架。让我们假装他们在ID为“search_results”的DIV元素中:

results = @browser.div(:id => "search_results").text

resultsFrame = @browser.frame(:index => 1)                #in the case of a frame
results = resultsFrame.div(id => "search_results).text

如您所见,您无需保存整个页面来解析结果。它们可以在表格单元格中,它们可以在每行不同的div中,也可以在新的帧中。所有这些都可以通过WATIR轻松访问,以存储在变量,数组中,或立即写入控制台或日志文件。

@results = Array.new                #create an Array to store our results

@browser.divs.each do |div|         #for each div element on the page
   if div.id == "search_results"    #if the div ID equals "search_results"
      @results << div.text          #add it to our array named @results
   end
end

现在,如果您只想要前5名there are many ways to access them

@results[0]      #first element
@results[0..4]   #first 5 elements

我还建议您研究一些编程原则,如DRY(不要重复自己)。在您看到他们共享代码的函数定义中,例如打开浏览器并访问相同的URL - 您可以合并这些:

def search(how, what)
  @browser = Watir::Browser.new :firefox
  @browser.goto "(that search url again)"
  @browser.text_field(:name => how).value = what
  etc...
end

search("name", "Hilton")
search("number", "555555")

由于我们知道两个可用的text_field名称是“name”和“number”,并且那些作为'how'具有良好的逻辑意义,我们可以对它们进行参数化并使用单个函数进行按名称搜索和搜索按数字测试用例。只要测试用例保持足够相似以便共享,这就更有效了。