我尝试编写一些正则表达式来确定客户端设备详细信息,例如操作系统名称,浏览器daetils仍然面临IE浏览器检测问题。
浏览器检测代码:
public static final BrowserBean getBrowserInfo(String userAgent){
BrowserBean browserBean = new BrowserBean();
Pattern pattern = Pattern.compile("(?i)(opera|chrome|safari|firefox|MSIE|trident)(\\s|\\/)(\\d+.\\d+)");
Matcher matcher = pattern.matcher(userAgent);
while (matcher.find()) {
int groupCount = matcher.groupCount();
if(groupCount >= 3){
browserBean.setBrowserName(matcher.group(1));
browserBean.setBrowserVersion(matcher.group(3));
}
}
return browserBean;
}
测试用例:
@Test
public void detectSafaritest() {
String userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.71 (KHTML, like Gecko) Version/6.1 Safari/537.71";
BrowserBean bean = UserAgentDetermination.getBrowserInfo(userAgent);
Assert.assertEquals("Safari", bean.getBrowserName());
Assert.assertEquals("537.71", bean.getBrowserVersion());
}
@Test
public void detectIEtest() {
String userAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; MASP)";
BrowserBean bean = UserAgentDetermination.getBrowserInfo(userAgent);
Assert.assertEquals("InterNet Explorer", bean.getBrowserName());
Assert.assertEquals("10.0", bean.getBrowserVersion());
}
@Test
public void detectFireFoxtest() {
String userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0";
BrowserBean bean = UserAgentDetermination.getBrowserInfo(userAgent);
Assert.assertEquals("Firefox", bean.getBrowserName());
Assert.assertEquals("25.0", bean.getBrowserVersion());
}
// @Test
// public void detectOperatest() {
// String userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.71 (KHTML, like Gecko) Version/6.1 Safari/537.71";
// BrowserBean bean = UserAgentDetermination.getBrowserInfo(userAgent);
// Assert.assertEquals("Safari", bean.getBrowserName());
// Assert.assertEquals("537.71", bean.getBrowserVersion());
// }
@Test
public void detectChrometest() {
String userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36";
BrowserBean bean = UserAgentDetermination.getBrowserInfo(userAgent);
Assert.assertEquals("Chrome", bean.getBrowserName());
Assert.assertEquals("30.0", bean.getBrowserVersion());
}
我遇到了IE和三叉戟浏览器的问题,因为我可以看到用户代理打印为: Mozilla / 5.0(兼容; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 5.0; MASP) Mozilla / 5.0(Windows NT 6.3; Trident / 7.0; rv:11.0),如Gecko
请帮我识别IE所有版本。
如果您正在帮我提供设备信息,将会很感激。
答案 0 :(得分:0)
您的二传手BrowserBean.setBrowserName
和BrowserBean.setBrowserVersion
将被调用两次,因为在find
循环中使用while
可获得多个匹配:
假设您的setter只是普通的设置者,Trident匹配将覆盖MSIE匹配。
答案 1 :(得分:-1)
你的正则表达式很好,问题出在你的断言声明中。对于IE,字符串包含“MSIE”,这就是您要查找(并返回)的内容。但是你的断言语句正在寻找字符串“InterNet Explorer”
虽然有一个小问题:正则表达式的最后一部分应该是(\\d+\\.\\d+)
而不是(\\d+.\\d+)
。这样它将匹配文字.
而不是任何单个字符。