2013-05-17 14 views
8

Próbuję kliknąć na przycisk wyszukiwania na tej stronie:Jak kliknąć na przycisk javascript w temat przeglądarki HtmlUnit

http://www.amadeusepower.com/trek/portals/trek/default.aspx?Culture=en-US

Przycisk jest tu gdzieś

<table cellpadding="0" cellspacing="0" class="QuickSearchFormFlightModuleButtonsTable" 
       width="100%"> 
       <tr> 
        <td class="cell1"> 
         <a id="ctl00_ctl00_ctl00_cph1_cph1_QuickSearchAll1_QuickFlightSearchControl1_hlFlightDetailedSearch" href="javascript:if(typeof notRedirectToTop == 'undefined'){document.forms[0].target = '_top';}__doPostBack('ctl00_ctl00_ctl00_cph1_cph1_QuickSearchAll1_QuickFlightSearchControl1_hlFlightDetailedSearch', '');">Advanced options</a> 
        </td> 
        <td class="cell2"> 
        </td> 
        <td class="cell3"> 

        </td> 
        <td class="cell4"> 
        </td> 
        <td class="cell5"> 
         <script>DumpButtonHTML('ctl00_ctl00_ctl00_cph1_cph1_QuickSearchAll1_QuickFlightSearchControl1_btnSearch','QuickSearchModuleFlightSearchStartSearchButton','QuickSearchModuleFlightSearchStartSearch','javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$ctl00$ctl00$cph1$cph1$QuickSearchAll1$QuickFlightSearchControl1$ctl00_ctl00_ctl00_cph1_cph1_QuickSearchAll1_QuickFlightSearchControl1_btnSearch_LinkButton&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, true, true));LockButton(this,\'\',true);Loading(IsValidForTableButton(\'\',true),\'DefaultSplash_SplashScreen\',\'/trek/App_Themes/trek_theme1/Templates/SplashScreens/\',\'ctl00_ctl00_ctl00_cph1_cph1_QuickSearchAll1_QuickFlightSearchControl1_txtSearch_txtFrom;ctl00_ctl00_ctl00_cph1_cph1_QuickSearchAll1_QuickFlightSearchControl1_txtSearch_txtTo;ctl00_ctl00_ctl00_cph1_cph1_QuickSearchAll1_QuickFlightSearchControl1_txtDepartureDate_txtDate;ctl00_ctl00_ctl00_cph1_cph1_QuickSearchAll1_QuickFlightSearchControl1_txtReturnDate_txtDate\');','True','Search','100px','True','','trek_theme1');</script> 
        </td> 
       </tr> 
      </table> 

Przycisk to przycisk wyszukiwania po lewej stronie witryny. Użyłem dodatku HtmlUnitScripter do firefoxa do generowania klasy, ale mimo że generuje kod, który wypełni formularze, nie generuje kodu, który kliknie przycisk.

Po naciśnięciu przycisku wyświetlany jest ekran ładowania, a następnie wyświetlane są wyniki. Normalnie to następny kod powinien powrócić na stronę wyników w page zmiennej

HtmlElement theElement5 = (HtmlElement) page.getElementById("ctl00_ctl00_ctl00_cph1_cph1_QuickSearchAll1_QuickFlightSearchControl1_btnSearch"); 
page = (HtmlPage) theElement5.click(); 

Ale to tylko zwraca poprzednią stronę z wypełnionych formularzy. Czy istnieje specjalny sposób na obsłużenie tego przycisku lub czy nie znajduję odpowiedniego przycisku do kliknięcia? Każda pomoc zostanie doceniona.

EDIT:

Wyjątek otrzymuję gdy użyłem

ScriptResult result = page.executeJavaScript("document.getElementById('ctl00_ctl00_ctl00_cph1_cph1_QuickSearchAll1_QuickFlightSearchControl1_btnSearch_Table').onclick()"); 
final Page newPage = result.getNewPage(); 

jest poniżej

Exception in thread "main" ======= EXCEPTION START ======== 
EcmaError: lineNumber=[64] column=[0] lineSource=[<no source>] name=[TypeError] sourceName=[http://www.amadeusepower.com/trek/Amadeus/js/Functions.js] message=[TypeError: Cannot read property "cancelBubble" from undefined (http://www.amadeusepower.com/trek/Amadeus/js/Functions.js#64)] 
com.gargoylesoftware.htmlunit.ScriptException: TypeError: Cannot read property "cancelBubble" from undefined (http://www.amadeusepower.com/trek/Amadeus/js/Functions.js#64) 
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:669) 
at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:601) 
at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507) 
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:555) 
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:530) 
at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptIfPossible(HtmlPage.java:979) 
at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScript(HtmlPage.java:947) 
at htmlunittest.test.com.TestEkoBilet.main(TestEkoBilet.java:51) 
Caused by: net.sourceforge.htmlunit.corejs.javascript.EcmaError: TypeError: Cannot read property "cancelBubble" from undefined (http://www.amadeusepower.com/trek/Amadeus/js/Functions.js#64) 
at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3603) 
at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3587) 
at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.typeError(ScriptRuntime.java:3608) 
at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.typeError2(ScriptRuntime.java:3624) 
at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.undefReadError(ScriptRuntime.java:3634) 
at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.getObjectPropNoWarn(ScriptRuntime.java:1488) 
at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpretLoop(Interpreter.java:1233) 
at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpret(Interpreter.java:798) 
at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:105) 
at com.gargoylesoftware.htmlunit.javascript.host.EventHandler.call(EventHandler.java:81) 
at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpretLoop(Interpreter.java:1531) 
at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpret(Interpreter.java:798) 
at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:105) 
at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.doTopCall(ContextFactory.java:405) 
at com.gargoylesoftware.htmlunit.javascript.HtmlUnitContextFactory.doTopCall(HtmlUnitContextFactory.java:275) 
at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3031) 
at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.exec(InterpretedFunction.java:115) 
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$3.doRun(JavaScriptEngine.java:546) 
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:654) 
... 7 more 
Enclosed exception: 
net.sourceforge.htmlunit.corejs.javascript.EcmaError: TypeError: Cannot read property "cancelBubble" from undefined (http://www.amadeusepower.com/trek/Amadeus/js/Functions.js#64) 
at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3603) 
at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3587) 
at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.typeError(ScriptRuntime.java:3608) 
at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.typeError2(ScriptRuntime.java:3624) 
at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.undefReadError(ScriptRuntime.java:3634) 
at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.getObjectPropNoWarn(ScriptRuntime.java:1488) 
at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpretLoop(Interpreter.java:1233) 
at script.StopEvent(http://www.amadeusepower.com/trek/Amadeus/js/Functions.js:64) 
at script.onclick(onclick event for HtmlTable[<table id="ctl00_ctl00_ctl00_cph1_cph1_QuickSearchAll1_QuickFlightSearchControl1_btnSearch_Table" onmouseout="this.className='QuickSearchModuleFlightSearchStartSearchButton';" border="0" width="100px" class="QuickSearchModuleFlightSearchStartSearchButton" cellpadding="0" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$ctl00$ctl00$cph1$cph1$QuickSearchAll1$QuickFlightSearchControl1$ctl00_ctl00_ctl00_cph1_cph1_QuickSearchAll1_QuickFlightSearchControl1_btnSearch_LinkButton&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, true, true));LockButton(this,'',true);Loading(IsValidForTableButton('',true),'DefaultSplash_SplashScreen','/trek/App_Themes/trek_theme1/Templates/SplashScreens/','ctl00_ctl00_ctl00_cph1_cph1_QuickSearchAll1_QuickFlightSearchControl1_txtSearch_txtFrom;ctl00_ctl00_ctl00_cph1_cph1_QuickSearchAll1_QuickFlightSearchControl1_txtSearch_txtTo;ctl00_ctl00_ctl00_cph1_cph1_QuickSearchAll1_QuickFlightSearchControl1_txtDepartureDate_txtDate;ctl00_ctl00_ctl00_cph1_cph1_QuickSearchAll1_QuickFlightSearchControl1_txtReturnDate_txtDate');StopEvent(event);" onmouseover="this.className='QuickSearchModuleFlightSearchStartSearchButtonOver';" style="cursor:pointer;cursor:hand;" cellspacing="0">] in http://www.amadeusepower.com/trek/portals/trek/default.aspx?Culture=en-US) 
at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpret(Interpreter.java:798) 
at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:105) 
at com.gargoylesoftware.htmlunit.javascript.host.EventHandler.call(EventHandler.java:81) 
at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpretLoop(Interpreter.java:1531) 
at script(injected script:1) 
at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpret(Interpreter.java:798) 
at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:105) 
at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.doTopCall(ContextFactory.java:405) 
at com.gargoylesoftware.htmlunit.javascript.HtmlUnitContextFactory.doTopCall(HtmlUnitContextFactory.java:275) 
at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3031) 
at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.exec(InterpretedFunction.java:115) 
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$3.doRun(JavaScriptEngine.java:546) 
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:654) 
at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:601) 
at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507) 
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:555) 
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:530) 
at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptIfPossible(HtmlPage.java:979) 
at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScript(HtmlPage.java:947) 
at htmlunittest.test.com.TestEkoBilet.main(TestEkoBilet.java:51) 
======= EXCEPTION END ======== 

Myślę, że próbuje uzyskać dostęp do innego skryptu w miejscu, ale to nie na bieżąca strona. Czy htmlunit może nadal uzyskiwać dostęp do tych skryptów za pośrednictwem jakiejś funkcji, czy jest to tak daleko, jak to możliwe?

EDIT 2:

znalazłem następujący skrypt w pobliżu początku strony. Czy to ma coś wspólnego z przyciskiem wyszukiwania? Wygląda na to, że ma identyfikator przycisku, ale nie jestem pewien.

</script> 
<form name="aspnetForm" method="post" action="default.aspx?Culture=en-US" onsubmit="javascript:return WebForm_OnSubmit();" onkeypress="javascript:return WebForm_FireDefaultButton(event, 'ctl00_ctl00_ctl00_cph1_cph1_QuickSearchAll1_QuickFlightSearchControl1_btnSearch')" id="aspnetForm"> 
    <div> 
    <input type="hidden" name="__WPPS" id="__WPPS" value="s"/> 
    <input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value=""/> 
    <input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value=""/> 
    <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value=""/> 
    <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPaA8FDzhkMDIyYzJhNTQzOGU2NBgBBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WBAVXY3RsMDAkY3RsMDAkY3RsMDAkY3BoMSRjcGgxJFF1aWNrU2VhcmNoQWxsMSRRdWlja0ZsaWdodFNlYXJjaENvbnRyb2wxJGNoa0NhbGVuZGFyU2VhcmNoBUxjdGwwMCRjdGwwMCRjdGwwMCRjcGgxJGNwaDEkUXVpY2tTZWFyY2hBbGwxJFF1aWNrRmxpZ2h0U2VhcmNoQ29udHJvbDEkY2hrRmlmBVJjdGwwMCRjdGwwMCRjdGwwMCRjcGgxJGNwaDEkUXVpY2tTZWFyY2hBbGwxJFF1aWNrRmxpZ2h0U2VhcmNoQ29udHJvbDEkY2hrQWRkZmFtaWx5BVFjdGwwMCRjdGwwMCRjdGwwMCRjcGgxJGNwaDEkUXVpY2tTZWFyY2hBbGwxJFF1aWNrRmxpZ2h0U2VhcmNoQ29udHJvbDEkY2hrRm9yY2VQVEMp3jYJ9QEgzYItUgLEnRZgeEkhsA=="/> 
    </div> 
    <script type="text/javascript"> 
+0

Wow. Nadal nie ma odpowiedzi? Czy pytanie jest niejasne, czy nie ma na to rozwiązania? – ManahManah

+0

Edytowałem post i dodałem dziennik wyjątków z uruchamiania metody executeJavaScript. Czy skrypt próbuje uzyskać dostęp do jakiegoś innego skryptu? czy brakuje mi jakiegoś oczywistego powodu? – ManahManah

Odpowiedz

1

Funkcja kliknięcie na element tabeli, spróbuj tego (nie spróbować na własną rękę):

HtmlElement theElement5 = (HtmlElement) page.getElementById("ctl00_ctl00_ctl00_cph1_cph1_QuickSearchAll1_QuickFlightSearchControl1_btnSearch_Table"); 
page = (HtmlPage) theElement5.click(); 

jest to nie działają, można włączyć dziennik na poziomie do debugowania se Co się dzieje, albo spróbować (działa na FF):

ScriptResult result = page.executeJavaScript("document.getElementById('ctl00_ctl00_ctl00_cph1_cph1_QuickSearchAll1_QuickFlightSearchControl1_btnSearch_Table').onclick()"); 
final Page newPage = result.getNewPage(); 

Podpowiedź: użycie Firebug, aby sprawdzić zmienne stron i elementów, a page.asXml(), aby uzyskać rzeczywisty stan strony.

+0

Pierwsza nadal zwraca starą stronę. Drugi rzuca wyjątek i kończy działanie. Dodałem dziennik wyjątków do pytania. – ManahManah

+0

może to być również spowodowane tym, że witryna najpierw przechodzi na ekran ładowania, a następnie wyświetla wyniki? – ManahManah

5

spróbować, jeśli jesteś w stanie kliknąć na przycisk

HtmlElement htmlElement = page.getFirstByXPath("//*[@id=\"ctl00_ctl00_ctl00_cph1_cph1_QuickSearchAll1_QuickFlightSearchControl1_btnSearch_Table\"]/tbody/tr/td[2]"); 
    htmlElement.click(); 

jeśli nie jest to, czego szukasz, a ty już obsługiwane część kliknij Proponuję spróbować czekać na stronie i JavaScript, żeby ładuj i uruchom.

spróbować

webClient.waitForBackgroundJavaScript(1000); 

lub

webClient.setAjaxController(new NicelyResynchronizingAjaxController()); 
webClient.setAjaxController(new AjaxController(){ 
@Override 
public boolean processSynchron(HtmlPage page, WebRequest request, boolean async) 
{ 
return true; 
} 
}); 

lub

JavaScriptJobManager manager = page.getEnclosingWindow().getJobManager(); 
while (manager.getJobCount() > 0) { 
Thread.sleep(100); 
} 
+0

sztuczka snu zadziałała dla mnie, świetnie! –