2013-05-19 18 views
5

Używam HtmlUnit w moim projekcie Java w celu przetestowania strony internetowej, która ma Javascript w środku. Mój kod klika przycisk wywołujący funkcję JavaScript, która przekieruje użytkownika na inną stronę (np. Usługi skracania linków). Jest to kod:HTMLUnit: zmiana ciągu agenta użytkownika

public void click() 
{ 
    WebClient webClient = new WebClient(); 
    HtmlPage page = webClient.getPage("http://mywebsite.com"); 
    HtmlImage a = page.getHtmlElementById("my_button"); 
    page = (HtmlPage) a.click(); 
} 

Problemem jest to, że HtmlUnit używa domyślnego agenta użytkownika (Internet Explorer 8) i istnieje tylko kilka ustawić (Firefox 17 i chrom). Zachowanie witryny mywebsite.com nie ulega zmianie, jeśli wykryje inną przeglądarkę/program użytkownika. Nawiasem mówiąc, ciąg agenta użytkownika jest przechowywany przez witrynę w celach statystycznych i muszę go zmienić za każdym razem, gdy go odwiedzę.

Próbowałem zmienić agenta użytkownika, tworząc nowy BrowserVersion obiekt w ten sposób:

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

przy okazji, kiedy instancję obiektu webclient przekazując moją bv obiekt, mój kod nie działa pracować już. Z tego, co zrozumiałem, dokumentacja HtmlUnit mówi, że muszę sprawdzić, czy agent użytkownika określony w mojej wersji BrowserVersion ma odpowiednie funkcje do uruchomienia Javascript.

Należy jednak pamiętać, że stałe nie są wystarczające, aby w pełni dostosować przeglądarkę , trzeba także spojrzeć w BrowserVersionFeatures i klas wewnątrz pakietu „Javascript”.

Co to znaczy? Dlaczego HtmlUnit już nie działa? Moim celem jest tylko zmiana ciągu znaków User Agenta. Jak mogę to osiągnąć? Zauważ, że próbowałem również Selenium, bez powodzenia. Dziękuję za pomoc.

EDIT 1:

Znaleziony ten trick. Jeśli zainicjuję BrowserVersion w następujący sposób:

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

działa, ale nie rozumiem DLACZEGO. Muszę ustawić pierwszy ciąg jako Netscape (wypróbowałem Chrome i Mozillę, ale to nie działa). Drugi ciąg jest losowy, mogę umieścić wszystko, jeśli Netscape jest ustawiony jako pierwszy parametr. Trzeci łańcuch to dobrze sformatowany Agent użytkownika, a czwarty parametr to liczba całkowita wskazująca wersję. Czy możesz mi wyjaśnić, dlaczego działa tylko wtedy, gdy Netscape jest przekazywany jako pierwszy parametr i losowy dla innych (z wyjątkiem drugiego)?

aktualizacje:

Czasami to nie działa (jak opisano powyżej). W przypadku niektórych łańcuchów agenta użytkownika strona nie ładuje się prawidłowo. Nie mogę zrozumieć, dlaczego użytkownik powinien zmodyfikować zachowanie HtmlUnit, ponieważ jestem pewien, że JavaScript jest dość łatwy i powinien być uruchamiany przez wszystkie wersje przeglądarek. Moje ostatnie pytanie to: Ostatnie pytanie:: jak mogę zmienić ciąg znaków agenta użytkownika w HtmlUnit bez zmiany jego zachowania podczas wykonywania Javascript?

Odpowiedz

0

Nie martw się o stworzenie nowej BrowserVersion obiekt.Można zmienić agenta użytkownika po utworzeniu kierowcę bez brudząc z wszystkimi wersjami bałagan:

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"); 

To będzie poprawnie odwiedzić http://facebook.com i przekierowanie do https://m.facebook.com/?_rdr&refsrc=https://www.facebook.com/ ponieważ ciąg kliencka mówi facebook przeglądarka jest iPhone.

+0

Czy nie jest to związane z selen? Mówię o HTMLUnit [tutaj] (http://htmlunit.sourceforge.net) – Angelo

0

Korzystanie HtmlUnit 2,28 można ustawić go jak w poniższym przykładzie poniżej

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