我正在尝试使用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"具有良好的逻辑意义,我们可以对它们进行参数化,并对按名称搜索和按数字搜索测试用例使用单个函数。这是更有效的,只要测试用例保持足够的相似以被共享。