我正在尝试编写一个爬虫,它从加载的页面中爬取所有链接,并将所有请求和响应标头以及响应正文记录在某个文件中,例如 XML 或 txt。我正在新浏览器窗口中打开第一个加载页面的所有链接,所以我不会收到此错误:
Element not found in the cache - perhaps the page has changed since it was looked up
我想知道从所有链接发出请求和接收响应然后定位输入元素并从所有打开的窗口提交按钮的替代方法是什么。我可以在一定程度上做到这一点,除非打开的窗口在右上角有一个常见的站点搜索框,比如这个http://www.testfire.net上的一个。我想要做的是我想省略这样的常见框,以便我可以使用i.send_keys "value"
webdriver 的方法用值填充其他输入并且不会收到此错误错误:在缓存中找不到元素 - 可能页面在查找后已更改.
从每个打开的窗口中检测和区分输入标签的方法是什么,以便在网站大多数页面上出现的常见输入标签中不会重复填充值。我的代码如下:
require 'rubygems'
require 'selenium-webdriver'
require 'timeout'
class Clicker
def open_new_window(url)
@driver = Selenium::WebDriver.for :firefox
@url = @driver.get " http://test.acunetix.com "
@link = Array.new(@driver.find_elements(:tag_name, "a"))
@windows = Array.new(@driver.window_handles())
@link.each do |a|
a = @driver.execute_script("var d=document,a=d.createElement('a');a.target='_blank';a.href=arguments[0];a.innerHTML='.';d.body.appendChild(a);return a", a)
a.click
end
i = @driver.window_handles
i[0..i.length].each do |handle|
@driver.switch_to().window(handle)
puts @driver.current_url()
inputs = Array.new(@driver.find_elements(:tag_name, 'input'))
forms = Array.new(@driver.find_elements(:tag_name, 'form'))
inputs.each do |i|
begin
i.send_keys "value"
puts i.class
i.submit
rescue Timeout::Error => exc
puts "ERROR: #{exc.message}"
rescue Errno::ETIMEDOUT => exc
puts "ERROR: #{exc.message}"
rescue Exception => exc
puts "ERROR: #{exc.message}"
end
end
forms.each do |j|
begin
j.send_keys "value"
j.submit
rescue Timeout::Error => exc
puts "ERROR: #{exc.message}"
rescue Errno::ETIMEDOUT => exc
puts "ERROR: #{exc.message}"
rescue Exception => exc
puts "ERROR: #{exc.message}"
end
end
end
#Switch back to the original window
@driver.switch_to().window(i[0])
end
end
ol = Clicker.new
url = ""
ol.open_new_window(url)
指导我如何使用 Selenium Webdriver 或使用http.set_debug_output
ruby 获取所有带有响应正文的requeat 和响应标头net/http
?