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



我正在尝试使用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页面并转储结果,而不必将此页面作为变量传递。

我想知道这里是否有人有什么建议?

使用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名,有很多方法可以访问它们。

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

我还建议你研究一些编程原则,比如DRY (Don't Repeat Yourself)。在你的函数定义中,你可以看到它们共享代码,比如打开浏览器并访问相同的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"one_answers"number",并且它们作为"how"具有良好的逻辑意义,我们可以对它们进行参数化,并对按名称搜索和按数字搜索测试用例使用单个函数。这是更有效的,只要测试用例保持足够的相似以被共享。

相关内容

  • 没有找到相关文章

最新更新