[英]Change the default browser of casperjs to chrome (Change the user-agent string)
[英]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.