我在我的 Java 项目中使用 HtmlUnit 来测试一个包含 Javascript 的网页。我的代码单击一个调用 Javascript 函数的按钮,将用户重定向到另一个页面(如链接缩短服务)。这是代码:
public void click()
{
WebClient webClient = new WebClient();
HtmlPage page = webClient.getPage("http://mywebsite.com");
HtmlImage a = page.getHtmlElementById("my_button");
page = (HtmlPage) a.click();
}
问题是 HTMLUnit 使用默认的用户代理(Internet Explorer 8),并且只有少数需要设置(Firefox 17 和 Chrome)。如果 mywebsite.com 检测到另一个浏览器/用户代理,它的行为不会改变。顺便说一句,用户代理字符串由网站存储用于统计目的,我每次访问时都需要更改它。
我试图通过BrowserVersion
以这种方式创建一个新对象来更改用户代理:
BrowserVersion bv = new BrowserVersion("Chrome", "Mozilla/5.0", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1468.0 Safari/537.36", 28);
顺便说一句,当我实例化一个传递我的对象的 Webclient 对象时bv
,我的代码不再工作了。据我了解,HtmlUnit 文档说我必须检查我的 BrowserVersion 中指定的用户代理是否具有运行 Javascript 的适当功能。
但是,请注意,常量不足以完全自定义浏览器,您还需要查看 BrowserVersionFeatures 和“javascript”包中的类。
这是什么意思?为什么 HtmlUnit 不再工作了?我的目标只是更改用户代理字符串。我怎样才能做到这一点?请注意,我也尝试过 Selenium,但没有成功。谢谢您的帮助。
编辑1:
发现了这个技巧。如果我按如下方式实例化 BrowserVersion:
BrowserVersion bv = new BrowserVersion("Netscape", "blablabla", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1468.0 Safari/537.36", 0);
它有效,但我不明白为什么。我必须将第一个字符串设置为 Netscape(尝试了 Chrome 和 Mozilla,但它不起作用)。第二个字符串是随机的,如果 Netscape 设置为第一个参数,我可以放任何东西。第三个字符串是格式良好的用户代理,第四个参数是一个整数,表示版本。你能解释一下为什么它只有在Netscape
作为第一个参数传递并随机传递给其他参数(第二个除外)时才有效?
更新:
有时它不起作用(如上所述)。对于某些用户代理字符串,页面未正确加载。我不明白为什么用户代理应该修改 HtmlUnit 的行为,因为我很确定 Javascript 它很容易并且应该由所有浏览器版本运行。所以,我的最后一个问题是:在执行 Javascript 时,如何在不改变其行为的情况下更改 HtmlUnit 中的用户代理字符串?