Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2015, 10:07   #1
[CODER]
Форумчанин
 
Аватар для [CODER]
 
Регистрация: 02.02.2010
Сообщений: 305
По умолчанию HtmlUnit выдает исключения. Необходимо найти причину и способ устранения

Здравствуйте!

Стоит задача написать парсер одного из сервисов для подачи визовых анкет.
Он находится ЗДЕСЬ


Написал такой код:

Код:
package htmlunitparser;
 
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlOption;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSelect;
import java.io.IOException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
 
/**
 *
 * @author Admin
 */
public class HtmlUnitParser {
 
    private final WebClient webClient;
 
    HtmlUnitParser() {
        webClient = new WebClient(BrowserVersion.FIREFOX_38);
        webClient.getOptions().setUseInsecureSSL(true);
        webClient.getOptions().setJavaScriptEnabled(true);
        webClient.getOptions().setRedirectEnabled(true);
        webClient.getOptions().setCssEnabled(false);
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        webClient.getOptions().setThrowExceptionOnFailingStatusCode(true);
    }
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        HtmlUnitParser hup = new HtmlUnitParser();
        hup.scan(7, 1);
    }
 
    /**
     * @param pointForVisaApplications код пункта приема визовых анкет (коды
     * берутся из выпадающего списка на сайте)
     * @param purposeOfTheVisit код цели визита (коды берутся из выпадающего
     * списка на сайте)
     */
    public void scan(int pointForVisaApplications, int purposeOfTheVisit) {
        try {
//[Страница 1] Выбор пункта меню (Назначение даты подачи документов)
            HtmlPage page = this.webClient.getPage(new URL("https://polandonline.vfsglobal.com/poland-ukraine-appointment/
       (S(vvzibb45kxnimzfrnhuavib1))/AppScheduling/AppWelcome.aspx?P=s2x6znRcBRv7WQQK7h4MTjZiPRbOsXKqJzddYBh3qCA="));
            page = page.getFormByName("aspnetForm").getElementsByAttribute("a", "id", "ctl00_plhMain_lnkSchApp").get(0).click();
//[Страница 2] Пункт приема визовых анкет
            HtmlSelect select = (HtmlSelect) page.getElementByName("ctl00$plhMain$cboVAC");
            HtmlOption option = select.getOptionByValue(Integer.toString(pointForVisaApplications));
            select.setSelectedAttribute(option, true);
//[Страница 2] Цель визита
            HtmlSelect select2 = (HtmlSelect) page.getElementByName("ctl00$plhMain$cboPurpose");
            HtmlOption option2 = select2.getOptionByValue(Integer.toString(purposeOfTheVisit));
            select2.setSelectedAttribute(option2, true);
//[Страница 2] Подтверждение
            page = page.getFormByName("aspnetForm").getInputByName("ctl00$plhMain$btnSubmit").click();
//[Страница 3] Вывод
            //System.out.println(page.asXml());
            //System.out.println(page.asText());
        } catch (IOException | FailingHttpStatusCodeException ex) {
            Logger.getLogger(HtmlUnitParser.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
Skype: CODERua

Последний раз редактировалось Stilet; 09.11.2015 в 10:24.
[CODER] вне форума Ответить с цитированием
Старый 09.11.2015, 10:10   #2
[CODER]
Форумчанин
 
Аватар для [CODER]
 
Регистрация: 02.02.2010
Сообщений: 305
По умолчанию

После запуска получаю следующее:


Цитата:
ноя 08, 2015 2:06:26 PM com.gargoylesoftware.htmlunit.Incor rectnessListenerImpl notify
WARNING: Obsolete content type encountered: 'application/x-javascript'.
ноя 08, 2015 2:06:27 PM com.gargoylesoftware.htmlunit.Incor rectnessListenerImpl notify
WARNING: Obsolete content type encountered: 'application/x-javascript'.
ноя 08, 2015 2:06:27 PM com.gargoylesoftware.htmlunit.Incor rectnessListenerImpl notify
....................
ноя 08, 2015 2:06:31 PM com.gargoylesoftware.htmlunit.javas cript.JavaScriptEngine handleJavaScriptException
INFO: Caught script exception
======= EXCEPTION START ========
EcmaError: lineNumber=[177] column=[0] lineSource=[<no source>] name=[ReferenceError] sourceName=[script in https://polandonline.vfsglobal.com/p...JzddYBh3qCA%3d from (176, 58) to (257, 14)] message=[ReferenceError: "onLoadTest" is not defined. (script in https://polandonline.vfsglobal.com/p...JzddYBh3qCA%3d from (176, 58) to (257, 14)#177)]
com.gargoylesoftware.htmlunit.Scrip tException: ReferenceError: "onLoadTest" is not defined. (script in https://polandonline.vfsglobal.com/p...JzddYBh3qCA%3d from (176, 58) to (257, 14)#177)
at com.gargoylesoftware.htmlunit.javas cript.JavaScriptEngine$HtmlUnitCont extAction.run(JavaScriptEngine.java :865)
at net.sourceforge.htmlunit.corejs.jav ascript.Context.call(Context.java:6 28)
at net.sourceforge.htmlunit.corejs.jav ascript.ContextFactory.call(Context Factory.java:513)
................................... ................
at htmlunitparser.HtmlUnitParser.scan( HtmlUnitParser.java:65)
at htmlunitparser.HtmlUnitParser.main( HtmlUnitParser.java:42)
Caused by: net.sourceforge.htmlunit.corejs.jav ascript.EcmaError: ReferenceError: "onLoadTest" is not defined. (script in https://polandonline.vfsglobal.com/p...JzddYBh3qCA%3d from (176, 58) to (257, 14)#177)
at net.sourceforge.htmlunit.corejs.jav ascript.ScriptRuntime.constructErro r(ScriptRuntime.java:3935)
at net.sourceforge.htmlunit.corejs.jav ascript.ScriptRuntime.constructErro r(ScriptRuntime.java:3919)
..........................
... 36 more
Enclosed exception:
net.sourceforge.htmlunit.corejs.jav ascript.EcmaError: ReferenceError: "onLoadTest" is not defined. (script in https://polandonline.vfsglobal.com/p...JzddYBh3qCA%3d from (176, 58) to (257, 14)#177)
at net.sourceforge.htmlunit.corejs.jav ascript.ScriptRuntime.constructErro r(ScriptRuntime.java:3935)
at script(script in https://polandonline.vfsglobal.com/p...JzddYBh3qCA%3d from (176, 58) to (257, 14):177)
................
at com.gargoylesoftware.htmlunit.html. DomElement.click(DomElement.java:68 0)
at htmlunitparser.HtmlUnitParser.scan( HtmlUnitParser.java:65)
at htmlunitparser.HtmlUnitParser.main( HtmlUnitParser.java:42)
======= EXCEPTION END ========

ноя 08, 2015 2:06:32 PM com.gargoylesoftware.htmlunit.Incor rectnessListenerImpl notify
WARNING: Obsolete content type encountered: 'text/javascript'.


Предупреждения вылезают из самого начала, а вот исключения после клика по кнопке на второй странице:
Код:
  page = page.getFormByName("aspnetForm").getInputByName("ctl00$plhMain$btnSubmit").click();
При этом, не смотря на исключения, 3-я страница загружается в переменную page и ее можно вывести раскомментировав строки из System.out.println
Skype: CODERua
[CODER] вне форума Ответить с цитированием
Старый 09.11.2015, 10:28   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А так не получится ничего. Ты всерьез думаешь что AppWelcome.aspx?P=s2x6znRcBRv7WQQK7 h4MTjZiPRbOsXKqJzddYBh3qCA= проканает?
Боюсь тебя разочаровывать, но я бы не надеялся вот так вот заграбастать сайтик на ASP.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.11.2015, 10:53   #4
[CODER]
Форумчанин
 
Аватар для [CODER]
 
Регистрация: 02.02.2010
Сообщений: 305
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ты всерьез думаешь что AppWelcome.aspx?P=s2x6znRcBRv7WQQK7 h4MTjZiPRbOsXKqJzddYBh3qCA= проканает?
Думал да, а после твоего сообщения просто надеюсь
Я на ASP.NET никогда не программировал, там есть какая-то уникальная специфика по сравнению с Servlet/PHP?

Код который я привел здесь - очень утрирован...
Я программно выдергиваю этот адрес из фрейма на другой странице .
Вот эта часть адреса ".../(S(vvzibb45kxnimzfrnhuavib1))/..." иногда изменяется в процессе регистрации пользователя для "назначения даты подачи документов", но если отслеживать редиректы, то с этим проблем не возникает.
Skype: CODERua
[CODER] вне форума Ответить с цитированием
Старый 09.11.2015, 10:56   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Разве это не просто ошибки в JS сайта?

Если
Цитата:
ее можно вывести раскомментировав строки из System.out.println
то видимо это просто HtmlUnit в лог пишет не бросая исключение дальше.

Так что скорее всего это никак не поможет вам решить вашу изначальную проблему (о которой вы ничего не рассказали).

Вообще я б Selenium взял вместо чистого HtmlUnit, он вроде удобнее и там тоже есть драйвер для HtmlUnit. Ну и если что проще сменить на например PhantomJS или обычный браузер.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 09.11.2015 в 11:00.
Alex11223 вне форума Ответить с цитированием
Старый 09.11.2015, 11:05   #6
[CODER]
Форумчанин
 
Аватар для [CODER]
 
Регистрация: 02.02.2010
Сообщений: 305
По умолчанию

Собственно это и вся проблема.
Нужно победить исключения.

Гипотетически выполнив
Код:
webClient.getOptions().setThrowExceptionOnScriptError(false);
подобные исключения вылезать не должны.
Но на практике это не работает или же проблема в чем-то другом.

Цитата:
Вообще я б Selenium взял вместо чистого HtmlUnit, он вроде удобнее и там тоже есть драйвер для HtmlUnit. Ну и если что проще сменить на например PhantomJS или обычный браузер.
Я вот тоже уже задумывался над этим...
Skype: CODERua
[CODER] вне форума Ответить с цитированием
Старый 09.11.2015, 12:25   #7
[CODER]
Форумчанин
 
Аватар для [CODER]
 
Регистрация: 02.02.2010
Сообщений: 305
По умолчанию

Действительно "понедельник - день тяжелый". Для меня все очень печально.

Расклад следующий.
Сегодня (или вчера) изменили каптчу которая используется при регистрации анкеты (была recaptcha1, а стала recaptcha2).
И если раньше можно было проверить доступность свободных мест для регистрации путем проверки активности кнопки подтверждения перед вводом каптчи. Если в ней был атрибут disabled="disabled", то это значило, что свободных мест нету, а если кнопка была активна, то выдавалось сообщение для оператора о возможности регистрации, после чего он вводил капчу и программа регистрировала анкету... За счет этого можно было делать фоновое сканирование. А сейчас узнать о наличии свободных для регистрации мест можно только после прохождения каптчи.



А обойти исключения, теоретически, возможно так:
Код:
        .......
        webClient.getOptions().setJavaScriptEnabled(false);
        page = page.getFormByName("aspnetForm").getInputByName("ctl00$plhMain$btnSubmit").click();
        webClient.getOptions().setJavaScriptEnabled(true);
        .......
Это конечно если для активации JS на странице HtmlUnit'у не потребуется перезагружать страницу, хотя при этом возможно у него есть какие-то методы, чтобы этого не делать (типа перерисовки для стилей) и это в случаи если HtmlUnit не активирует JS сразу после setJavaScriptEnabled(true). Этого я не проверял, т. к. сейчас нету времени...
Skype: CODERua
[CODER] вне форума Ответить с цитированием
Старый 09.11.2015, 12:55   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
там есть какая-то уникальная специфика по сравнению с Servlet/PHP?
Да там много всего... Сессии, состояния контролов... Всего не опишешь, но с вероятностью 90% при таком подходе прилетит птичка Обломинго.
Цитата:
Вот эта часть адреса ".../(S(vvzibb45kxnimzfrnhuavib1))/..." иногда изменяется в процессе регистрации пользователя для "назначения даты подачи документов", но если отслеживать редиректы, то с этим проблем не возникает.
Это так кажется.
В случае с ASP все малость сложнее.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.11.2015, 13:13   #9
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Нужно победить исключения.
Зачем?
Ну закройте окно лога, вот и победите.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Немогу найти никак причину в Делфи 7 курбанниязов Помощь студентам 2 24.01.2014 18:07
Помочь найти причину drzod Помощь студентам 1 28.02.2013 07:23
Не могу найти причину ошибки pastuhdima Помощь студентам 0 06.10.2011 00:24
Задача с матрицей. Не могу найти причину неправильной работы программы. Azzzza Общие вопросы C/C++ 1 28.04.2011 21:03
помогите найти причину ошибки! НиКС БД в Delphi 3 10.05.2007 15:55