对于我正在进行的一个项目,我需要伪造一个 IP 地址,以显示我来自另一个国家。
基本上,如果检测到的 IP 来自英国,则显示弹出窗口 A,如果检测到的 IP 来自英国以外,则显示弹出窗口 B。
我希望能够自动执行此操作。目前我们所有的浏览器自动化测试都是用 cucumber/watir 编写的,我想得到一个使用相同框架的解决方案。
有谁知道这样做的可能方法?
谢谢!
一般来说,如果您关心您的 HTTP 请求返回给您的结果,那么 IP 欺骗是不可能的。
http://en.wikipedia.org/wiki/IP_address_spoofing
如果这是为了测试,您可以在本地网络上为“在英国”和“不在英国”的每个用例运行虚拟机。为每个不会更改的 VM 分配一个本地 IP 地址。
在每个 VM 中运行 HTTP 代理服务器,并根据测试用例让您的单元测试通过不同的代理服务器连接。
将覆盖逻辑添加到您的地理位置代码中,以将这些众所周知的本地 IP 地址视为其各自测试位置的一部分。请注意,行为良好的代理服务器将在请求中包含代理服务器的 IP 地址和原始 IP 地址。确保在此单元测试中使用代理服务器的 IP 地址进行地理定位(通常,您会希望在可用于生产地理定位的情况下使用原始 IP 地址)。
请注意,任何关心绕过此类控制的人都非常容易。只需支付很少的费用,就可以访问英国有意不转发原始 IP 地址的 HTTP 代理服务器。
最简单的解决方案是添加一些神奇的请求参数,允许您在英国和其他国家之间切换。例如,假设这样的事情会启用“英国模式”:
browser.goto "localhost/?country=UK"
然后,在服务器端应该有一些 if 语句来检查该参数。在伪代码中:
if get_parameters["country"] == "UK"
enable_uk_mode
end
这将允许您只指定GET parameter
打开“英国模式”或其他模式。我通常会走这条路,因为安装和管理所有 VM-s 和代理服务器以及管理它们的所有配置所花费的时间比在应用程序的开发模式中添加一些控制逻辑所花费的时间要多得多。
您可以添加 HTTP 请求处理程序检查的“FakeIP”cookie,如果应用程序在测试模式下运行,则它会用假 IP 覆盖真实 IP。
示例:我实际上是在我的 Play Framework / Scala 应用程序中执行此操作。在我的 HTTP 请求类中:
def ip =
if (!Play.isTest)
underlyingRequest.remoteAddress
else
underlyingRequest.cookies.get("FakeIP").map(_.value).getOrElse(
underlyingRequest.remoteAddress)
然后在我的 Selenium E2E 测试的顶部:
add cookie ("FakeIP", "111.112.113.114")
仅此而已:-)(至少在我的情况下)
根据检测的方式,在某些情况下,您应该使用浏览器语言。这种代码:
profile = Selenium::WebDriver::Firefox::Profile.new
profile['intl.accept_languages'] = "fr"
browser = Watir::Browser.new :firefox, :profile => profile
对于ip,为什么不考虑使用代理呢?
profile = Selenium::WebDriver::Firefox::Profile.new
profile.proxy = Selenium::WebDriver::Proxy.new :http => 'my.proxy.com:8080', :ssl => 'my.proxy.com:8080'
browser = Watir::Browser.new :firefox, :profile => profile
我认为你应该两者兼而有之:它更像是一个真正的用户使用他的浏览器。