2013-05-19 6 views
5

Javascript가 내부에있는 웹 페이지를 테스트하기 위해 Java 프로젝트에서 HtmlUnit을 사용하고 있습니다. 내 코드는 Javascript 함수를 호출하는 버튼을 클릭하여 링크 단축키 서비스와 같은 다른 페이지로 사용자를 리디렉션합니다.HTMLUnit : 사용자 에이전트 문자열 변경

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과 기본 사용자 에이전트 (인터넷 익스플로러 8)을 사용하고 (파이어 폭스 (17)와 크롬)을 설정하는 몇 만이있다 :이 코드입니다. 다른 브라우저/사용자 에이전트를 발견하면 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과 클래스로 볼 필요, 상수 완전히 브라우저를 사용자 정의하는 것만으로는 충분하지 참고.

이게 무슨 의미입니까? HtmlUnit이 더 이상 작동하지 않는 이유는 무엇입니까? 내 목표는 사용자 에이전트 문자열을 변경하는 것입니다. 이것을 어떻게 할 수 있습니까? 내가 성공하지 못한 채 셀레늄도 시도했음을 주목하라. 도움 주셔서 감사합니다.

편집 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); 

작동하지만, 나는 왜 이해하지 못합니다. 넷스케이프 (Chrome과 Mozilla를 시도했지만 작동하지 않음)로 첫 번째 문자열을 설정해야합니다. 두 번째 문자열은 무작위로, Netscape가 첫 번째 매개 변수로 설정된 경우 아무 것도 넣을 수 있습니다. 세 번째 문자열은 잘 형식화 된 사용자 에이전트이고 네 번째 매개 변수는 버전을 나타내는 정수입니다. Netscape이 첫 번째 매개 변수로 전달되고 두 번째 매개 변수를 제외한 다른 사람에게 전달되는 경우에만 작동하는 이유를 설명 할 수 있습니까?

업데이트합니다 (전술 한 바와 같이)

가 가끔 작동하지 않습니다. 일부 사용자 에이전트 문자열의 경우 페이지가 제대로로드되지 않습니다. 나는 사용자 에이전트가 HtmlUnit의 동작을 수정해야하는 이유를 이해할 수 없다. Javascript는 매우 쉽고 모든 브라우저 버전에서 실행되어야한다. 그래서, 내 최종 질문입니다 : 어떻게하면 자바 스크립트를 실행하면 그 행동을 변경하지 않고 HtmlUnit에서 사용자 에이전트 문자열을 변경할 수 있습니까?

답변

0

을 발견했다.당신은 모든 버전의 혼란 덤비는없이 드라이버를 생성 한 후 사용자 에이전트를 변경할 수 있습니다 : 사용자 에이전트 문자열은 브라우저가 아이폰이다 페이스 북의 지시 때문에

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/로 리디렉션.

+0

아래의 예처럼 설정할 수 있습니다 HtmlUnit과 2.28를 사용하고 계십니까? HTMLUnit [여기] (http://htmlunit.sourceforge.net)에 대해 이야기하고 있습니다. – Angelo

0

이이 셀레늄 관련이없는

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