3

我正在测试一个网络爬虫,我想使用 Webmock 来提供虚假网站以加快测试速度。当我模拟一个网站时,Ruby 的原生 HTTP 库工作正常,但 Capybara 似乎无法接收模拟的响应。我知道 webmock 正在存根低级别的 HTTP 请求,我认为使用哪一个 capybara 以及配置使用哪一个 webmock 很重要。但是,我需要知道 Capybara 如何发出 HTTP 请求以及如何配置 webmock 以存根该特定方法集。

require 'capybara/poltergeist'
require 'webmock'
require 'pry'
include WebMock::API
WebMock.disable_net_connect!(allow_localhost:true)


Capybara.register_driver :poltergeist do |app|
    Capybara::Poltergeist::Driver.new(app, js_errors: false)
end
# Configure Capybara to use Poltergeist as the driver
Capybara.default_driver = :poltergeist
Capybara.javascript_driver = :poltergeist

U = /google.com/

b = Capybara.current_session

stub_request(:any, U).
with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Ruby'}).
to_return(status:200, body:"abc", headers:{})

puts Net::HTTP.get(U,'/') #=> This returns "abc"

b.visit U
puts b.html  #=> Throws error

我得到的错误如下: command': Request failed to reach server, check DNS and/or server status (Capybara::Poltergeist::StatusFailError)

我也尝试过使用 FakeWeb,但这根本无法注册 URI。如果您认为这是错误的工作工具,我愿意使用除 webmock 之外的其他 API。

提前致谢 :)

4

2 回答 2

4

汤姆沃尔波尔是正确的。您可以使用 WebMock 来模拟您的服务器正在连接的东西,但是浏览器会建立自己的连接,并且不受您对服务器所做的更改的影响。

如果您想伪造来自其他服务器的浏览器请求的响应,请尝试使用Puffing Billy之类的方法。看看可以设置为重播结果的缓存功能(很像 VCR)。

如果您正在使用非常简单的东西,您可以尝试使用Capybara.string加载您需要的数据。但这对于你想要的可能太有限了。

于 2015-08-15T18:58:37.663 回答
1

Capybara 不会发出 Web 请求,它会告诉浏览器去哪里访问,然后浏览器会发出请求。做你想做的事情的方法是使用可以将特定浏览器请求重定向到你自己的应用程序的代理

于 2015-08-15T13:29:37.913 回答