Вход в Java-сайт с проблемой WWW::Scripter charset
Я пытаюсь войти на сайт Java с помощью модуля WWW::Scripter. Использование модуля WWW::Mechanize работает нормально, но после проверки подлинности на сайте есть функции JavaScript, которые мне нужно вызывать - следовательно, требуется Scripter.
После выполнения большого количества устранения неполадок я обнаружил, что разница в пакетах, отправляемых из события click (), является varaibale Content-Type.
Механизация имеет:
Content-Type: application/x-www-form-urlencoded\r\n, но Scripter имеет:
Content-Type: application/x-www-form-urlencoded; charset="ISO-8859-1"\r\n
(это просматривается с помощью WireShark)
Это объясняет ошибку, которую я получаю с веб-сайта:
сообщение об ошибке: трассировка стека ошибок "ISO-8859-1": java.nio.charset.IllegalCharsetNameException: "ISO-8859-1" в java.nio.charset.Charset.checkName(Charset.java:305) в java.nio.charset.Charset.lookup(Charset.java:439) в java.nio.charset.Charset.forName(Charset.java(встроенный скомпилированный код))
at java.lang.StringCoding$DecoderCache.makeDecoder(StringCoding.java(Com
сложенный код)) в java.lang.StringCoding$1.run(StringCoding.java(скомпилированный код)) в java.security.AccessController.doPrivileged1(собственный метод) в java.security.AccessController.doPrivileged(AccessController.java(скомпилированный код)) в java.lang.StringCoding$DecoderCache.getDecoder(StringCoding.java(скомпилированный код)) в java.lang.StringCoding.getDecoder(StringCoding.java(встроенный скомпилированный код)) в java.lang.StringCoding.decode (StringCoding.java (скомпилированный код)) на java.lang.String. (String.java (скомпилированный код)) на java.lang.String. (String.java (встроенный скомпилированный код)) на com.ibm.ws.webcontainer.servlet.RequestUtils.parsePostData(RequestUti ls.java(скомпилированный код)) по адресу com.ibm.ws.webcontainer.srt.SRTServletRequest.parseParameters(SRTServ letRequest.java(скомпилированный код)) по адресу com.ibm.ws.webcontainer.svtReRS.getParameterNames (SRTSe rvletRequest.java (скомпилированный код)) в javax.servlet.ServletRequestWrapper.getParameterNames(ServletRequestW rapper.java(скомпилированный код)) в org.apache.struts.util.RequestUtils.populate(RequestUtils.java(скомпилированный код)) в org.apache.struts.action.RequestProcessor.processPopulate(RequestProc essor.java(скомпилированный код)) в org.apache.struts.action.RequestProcessor.process(RequestProcessor.ja va(скомпилированный код)) в org.apache.struts.action.ActionServlet.process(ActionServlet.java(встроенный код)) в org.apache.struts.action.ActionServlet.doPost(ActionServlet.java(скомпилировано) Код)) на javax.servlet.http.HttpServlet.service(HttpServlet.java(скомпилированный код)) на javax.servlet.http.HttpServlet.service(HttpServlet.java(скомпилированный код)) на com.ibm.ws.webcontainer.servlet.StrictServletInstance.doService(Stric tServletInstance.java(скомпилированный код)) на com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet._service(Stric tLifecycleServlet.java(скомпилированный код)) на com.ibm.ers.we.web.IdleServletState.service(StrictLifecy cleServlet.java(скомпилированный код)) по адресу com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet.service(Strict LifecycleServlet.java(встроенный скомпилированный код)) на com.ibm.ws.webcontainer.servlet.ServletInstance.service (ServletI nstan ce.java (скомпилированный код)) на com.ibm.ws.webcontainer.servlet.ValidServletReferenceState.dispatch(V alidServletReference (Скомпилированный код)) на com.ibm.ws.webcontainer.servlet.ServletInstanceReference.dispatch(Ser vletInstanceReference.java(встроенный скомпилированный код)) на com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilj (WebAppFiljte) Скомпилированный код)) на com.infostream.web.filters.HibernateSessionFilter.doFilter (HibernateS essionFilter.java (скомпилированный код)) на com.ibm.ws.webcontainer.filter.FilterI nstanceWrapper.doFilter (FilterI nstanceWrailed.java) на com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilte rChain.java (скомпилированный код)) на com.infostream.web.filters.IdentificationFilter.doFilter (Identificati onFilter.java (скомпилированный код)) на com..ws.webcontainer.filter.FilterI nstanceWrapper.doFilter (FilterI nstanceWrapper.java (скомпилированный код)) t com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilte rChain.java (скомпилированный код)) по адресу com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.handleWebAppDi Spatch (веб-приложение) (веб-приложение) (веб-приложение).ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch (WebAp pRequestDispatcher.java (скомпилированный код)) по адресу com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward (компилятор кода приложения WebApp)..ws.webcontainer.srt.WebAppI nvoker.doForward (WebAppI nvoker.jav a (скомпилированный код)) по адресу com.ibm.ws.webcontainer.srt.WebAppI nvoker.handleI nvocationHook (WebApp I nvoker.java (скомпилированный код)) по адресу com.ibm.w.webcontainer.cache.invocation.CachedI nvocation.handleI nvoc ation (CachedI nvocation.java (Скомпилированный код)) в com.ibm.ws.webcontainer.cache.invocation.CacheableI nvocationContext.i nvoke (CacheableI nvocationConteibm)..ws.webcontainer.srp.ServletRequestProcessor.dispatchByURI(Ser vletRequestProcessor.java(Скомпилированный код)) на com.ibm.ws.webcontainer.oselistener.OSEListenerDispatcher.service(OSE Listener.java(скомпилированный код)) на com.ibm.ws.webcontainer.http.HttpConnection.handleRequest(HttpConnect ion.java(скомпилированный код)) на com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection.ja va(скомпилированный код)) в com.ibm.ws.http.HttpConnection.run(HttpConnection.java(скомпилированный код)) в com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java(скомпилированный код))
Код, который я использую для проверки логина:
#!/usr/bin/perl -w
use WWW::Scripter;
my $urlLogin = "XXX";
my $viper = WWW::Scripter->new();
$viper->use_plugin('JavaScript');
$viper->get($urlLogin);
$viper->form_name('loginForm');
$viper->field(username => "xxx");
$viper->field(password => "xxx");
$viper->click();
Как упоминалось ранее, это работает нормально, если я использую WWW::Mechanize вместо WWW::Scripter.
Может кто-нибудь предложить, что я могу сделать, чтобы удалить поле charset в Content-Type пакета POST'ed.
1 ответ
Я вижу, что вы опубликовали этот вопрос в PerlMonks, и они ответили на ваш вопрос.
Что касается CPAN в комментариях к модулю, я вижу это: "ОШИБКИ: их слишком много, чтобы перечислить! Эта штука в настоящее время очень нестабильна, мягко говоря".
Я думаю, что лучшая веб-автоматизация с поддержкой javascript - это WWW::Mechanize::Firefox. Чтобы использовать это, вы должны установить Firefox на свой компьютер и добавить дополнение. Скрипт perl будет использовать firefox для рендеринга страницы с помощью javascript через это дополнение. Если страница работает с Firefox, это может привести к путанице.
С Уважением,