如何遍历div中的所有链接并从打开的字段中收集值

时间:2012-02-04 15:57:08

标签: ruby watir watir-webdriver

是否可以打开某个div中的每个链接并在一个文件或至少终端输出中收集已打开字段的值?

我正在尝试获取google map上可见的所有标记的坐标列表。

all_links = b.div(:id, "kmlfolders").links
all_links.each do |link|
   b.link.click
   b.link(:text, "Norādījumi").click
   puts b.text_field(:title, "Galapunkta_adrese").value
end

是否有更简单或更有效的方法来自动收集所有标记的坐标?

enter image description here

2 个答案:

答案 0 :(得分:0)

除非你已经可以通过的HTML中有其他数据(alt标签?通过onhover调用的元素?),这似乎是迭代链接的最实用的方法,但是我可以看到你是实际上并没有在循环中使用'link'对象。你需要更多像这样的东西

all_links = b.div(:id, "kmlfolders").links
all_links.each do |thelink|
   b.link(:href => thelink.href).click
   b.link(:text, "Norādījumi").click
   puts b.text_field(:title, "Galapunkta_adrese").value
end

可能使用他们的API是获得你想要的更有效的方法然而,这就是人们毕竟制作API的原因,如果一个可用,那么使用它几乎总是最好的。从长远来看,使用测试工具作为屏幕抓取器来收集信息比学习如何进行api调用并以这种方式获取数据要困难得多。

对于基于Web的api和Ruby我发现REST-CLIENT gem很有用,其他人如HTTP-Party

答案 1 :(得分:0)

由于我还不熟悉Google API,因此我发现很难根据某个特定需求深入了解API。因此,我制作了简短的watir-webdriver脚本,用于收集受保护的谷歌地图上的标记坐标。生成的文件用于python脚本,为导航设备创建speedcam文件。

在这种情况下,它的speedcam地图由拉脱维亚警方维护和更新,但这个脚本可以通过替换网址与任何谷歌地图一起使用。

# encoding: utf-8
require "rubygems"
require "watir-webdriver"
@b = Watir::Browser.new :ff
#--------------------------------

@b.goto "http://maps.google.com/maps?source=s_q&f=q&hl=lv&geocode=&q=htt%2F%2Fmaps.google.com%2Fmaps%2Fms%3Fmsid%3D207561992958290099079.0004b731f1c645294488e%26msa%3D0%26output%3Dkml&aq=&sll=56.799934,24.5753&sspn=3.85093,8.64624&ie=UTF8&ll=56.799934,24.5753&spn=3.610137,9.887695&z=7&vpsrc=0&oi=map_misc&ct=api_logo"
@b.div(:id, "kmlfolders").wait_until_present
all_markers = @b.div(:id, "kmlfolders").divs(:class, "fdrlt")
@prev_coordinates = 1
puts "#{all_markers.length} speedcam markers detected"

File.open("list_of_coordinates.txt","w") do |outfile|
all_markers.each do |marker|
    sleep 1
    marker.click
    sleep 1
    description = @b.div(:id => "iw_kml").text
    @b.span(:class, "actbar-text").click
    sleep 2
    coordinates = @b.text_field(:name, "daddr").value
    redo if coordinates == @prev_coordinates
    puts coordinates
    outfile.puts coordinates
    @prev_coordinates = coordinates
end
end

puts "Coordinates saved in file!"

@b.close

适用于Mac OSX 10.7和Windows7。