对于我正在处理的项目,我需要伪造一个IP地址,以显示我来自其他国家。
基本上,如果检测到的IP来自英国,则显示弹出窗口A,如果检测到的IP来自英国境外,则显示弹出窗口B.
我希望能够实现自动化。目前我们所有的浏览器自动化测试都是用cucumber / watir编写的,我希望得到一个使用相同框架的解决方案。
有谁知道可能的方法吗?
谢谢!
答案 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")
除此之外没有多少:-)(至少在我的情况下)