创建特定于区域的IP地址以进行测试

时间:2012-12-13 18:57:17

标签: ip cucumber watir

对于我正在处理的项目,我需要伪造一个IP地址,以显示我来自其他国家。

基本上,如果检测到的IP来自英国,则显示弹出窗口A,如果检测到的IP来自英国境外,则显示弹出窗口B.

我希望能够实现自动化。目前我们所有的浏览器自动化测试都是用cucumber / watir编写的,我希望得到一个使用相同框架的解决方案。

有谁知道可能的方法吗?

谢谢!

4 个答案:

答案 0 :(得分:4)

一般来说,如果您关心HTTP请求的结果,则无法进行IP欺骗。

http://en.wikipedia.org/wiki/IP_address_spoofing

如果是测试,则可以在本地网络上为“英国”和“非英国”的每个用例运行虚拟机。为每个不会更改的VM分配本地IP地址。

在每个VM中运行HTTP代理服务器,并根据测试用例让您的单元测试通过不同的代理服务器进行连接。

将覆盖逻辑添加到地理位置代码中,以将这些众所周知的本地IP地址视为其各自测试位置的一部分。请注意,行为良好的代理服务器将在请求中包含代理服务器的IP地址和原始IP地址。请确保使用代理服务器的IP地址进行此​​单元测试的地理定位(通常,您可能希望使用可用于生产地理位置的原始IP地址)。

请注意,对于任何想要绕过此类控件的人来说,非常很容易。可以访问英国的HTTP代理服务器,该服务器故意不转发原始IP地址,只需很少的费用。

答案 1 :(得分:1)

最简单的解决方案是添加一些魔术请求参数,允许您在英国和其他人之间切换。例如,假设这样的话会启用“ UK模式”:

browser.goto "localhost/?country=UK"

然后,在服务器端应该有一些if语句来检查该参数。在伪代码中:

if get_parameters["country"] == "UK"
  enable_uk_mode
end

这样您就可以指定GET parameter来启用“ UK模式”或其他模式。我通常会采用这种方式,因为安装和管理所有VM和代理服务器并管理所有配置只需要花费更多的时间,而不是将一些控制逻辑添加到应用程序的开发模式中。

答案 2 :(得分:0)

根据检测的方式,在某些情况下,您应该使用浏览器语言。这种代码:

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

我认为你应该做到这两点:它将更像真正的用户使用他的浏览器。

答案 3 :(得分:0)

您可以添加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")

除此之外没有多少:-)(至少在我的情况下)