簡體   English   中英

HTMLUnit:更改用戶代理字符串

[英]HTMLUnit: change User Agent string

我在我的 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);

順便說一句,當我實例化傳遞我的bv對象的 Webclient 對象時,我的代碼不再起作用。 據我所知,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 中的用戶代理字符串而不改變其行為?

使用 Htmlunit 2.28 你可以像下面這個例子一樣設置它

final BrowserVersion myChrome = new BrowserVersion.BrowserVersionBuilder(BrowserVersion.CHROME)
    // do your setup here
    .setXXX(..)
    .build();

您可以將其傳遞給WebClient構造函數:

WebClient webClient = new WebClient(BrowserVersion.CHROME);

此處列出了支持的用戶代理: http : //htmlunit.sourceforge.net/apidocs/com/gargoylesoftware/htmlunit/BrowserVersion.html

不要擔心創建一個新的BrowserVersion對象。 您可以在創建驅動程序后更改用戶代理,而不會弄亂所有版本控制:

String DEFAULT_MOBILE_USER_AGENT_STRING = "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25";

HtmlUnitDriver driver = new HtmlUnitDriver(); //Or insert a capabilities object
driver.getBrowserVersion().setUserAgent(DEFAULT_MOBILE_USER_AGENT_STRING);
driver.get("http://facebook.com");

這將正確訪問http://facebook.com並被重定向到https://m.facebook.com/?_rdr&refsrc=https://www.facebook.com/因為用戶代理字符串告訴 facebook 瀏覽器是 iPhone .

在 Selenium 3 上,您可以執行以下操作:

val browser = BrowserVersionBuilder(BrowserVersion.CHROME).build()
val driver = HtmlUnitDriver(browser);

BrowserVersionBuilder帶來了很多自定義。

在構建 Chrome Driver 對象時,我能夠將用戶代理設置為隨機字符串,例如“Selenium”。

ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--start-maximized");
chromeOptions.addArguments("user-agent=Selenium");
chromeOptions.setExperimentalOption("useAutomationExtension", false);
aDriver = new ChromeDriver(chromeOptions);
aDriver.manage().timeouts().implicitlyWait(Const.Chrome_TIMEOUT, TimeUnit.SECONDS);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM