Я немного не синхронизирован с веб-программированием, и проникновение в HTMLUnit немного более запутанно, чем я думал.
blockquote>Если вы хотите автоматизировать веб-страницу в наши дни, вам необходимо общее представление о веб-технологиях, по крайней мере, Html, Javascript и самом HTTP, чтобы понять, что делать.
Давайте начнем с верха - с вашей
прекрасной ошибкой
blockquote>В качестве отправной точки откройте страницу в реальном браузере и посмотрите на веб приставка. Там вы увидите ту же ошибку; это означает, что на странице, которую вы пытаетесь автоматизировать, есть ошибка (по крайней мере, одна), и ваш браузер просто игнорирует это. HtmlUnit был создан как инструмент тестирования; из-за этого более требовательны к ошибкам. Вы должны отключить это.
webClient.getOptions().setThrowExceptionOnScriptError(false);
Следующий шаг: вы пытаетесь получить доступ к форме на странице
Поскольку имя метода подразумевает, что getFormByName () может найти формы, имеющие правильный атрибут name - но Ваша форма не имеет.
Следующий шаг:
Поскольку имя метода подразумевает, что 'getElementById ("201910") "может найти элементы, имеющие правильный атрибут id - но у вашего переключателя такого нет. [1113 ]
И то же самое для кнопки. Ниже вы можете найти быстрый взлом, который делает эту работу. Это может помочь прочитать хотя бы страницу HtmlUnit - Начало работы с HtmlUnit . Также доступен Javadoc с подробными описаниями.
Надеюсь, это поможет
public static void main(String[] args) throws IOException { String url = "https://mystudentrecord.ucmerced.edu/pls/PROD/xhwschedule.p_selectsubject"; try (final WebClient webClient = new WebClient()) { webClient.getOptions().setThrowExceptionOnScriptError(false); HtmlPage page = webClient.getPage(url); webClient.waitForBackgroundJavaScript(1000); page = (HtmlPage) webClient.getCurrentWindow().getEnclosedPage(); final HtmlForm form = page.getForms().get(0); for (DomElement elem : form.getElementsByTagName("INPUT")) { if (elem instanceof HtmlRadioButtonInput) { HtmlRadioButtonInput radioButton = (HtmlRadioButtonInput) elem; if ("201910".equals(radioButton.getValueAttribute()) || "N".equals(radioButton.getValueAttribute())) { radioButton.setChecked(true); } } } for (DomElement elem : form.getElementsByTagName("INPUT")) { if (elem instanceof HtmlSubmitInput) { if ("View Class Schedule".equals(elem.getAttribute("value"))) { elem.click(); } } } webClient.waitForBackgroundJavaScript(1000); page = (HtmlPage) webClient.getCurrentWindow().getEnclosedPage(); System.out.println("----------------"); System.out.println(page.asXml()); } }
Вот быстрый пример от Microsoft.
static TCHAR hdrs[] =
_T("Content-Type: application/x-www-form-urlencoded");
static TCHAR frmdata[] =
_T("name=John+Doe&userid=hithere&other=P%26Q");
static LPSTR accept[2]={"*/*", NULL};
// for clarity, error-checking has been removed
HINTERNET hSession = InternetOpen("MyAgent",
INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
HINTERNET hConnect = InternetConnect(hSession, _T("ServerNameHere"),
INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
HINTERNET hRequest = HttpOpenRequest(hConnect, "POST",
_T("FormActionHere"), NULL, NULL, accept, 0, 1);
HttpSendRequest(hRequest, hdrs, strlen(hdrs), frmdata, strlen(frmdata));
// close any valid internet-handles
Пример прибывает отсюда.
В конечном счете я нашел некоторый рабочий пример в сети
static char szRawData[5000];
memset(szRawData, 0x11, sizeof(szRawData));
//
// CIHandle is just a wrapper class for HINTERNET, that closes handle in destructor
//
CIHandle hIntrn = InternetOpen( "LiveUpdate"),
INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY,
NULL,
NULL,
0);
if (!hIntrn)
return printf("No Internet connection: %li.\n", GetLastError());
CIHandle hConn = InternetConnect( hIntrn,
"65.254.250.104",
INTERNET_DEFAULT_HTTP_PORT,
NULL,
NULL,
INTERNET_SERVICE_HTTP,
0,
NULL);
if (!hConn)
return printf("Connection to update server failed: %li.\n", GetLastError());
DWORD dwOpenRequestFlags = INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |
INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS |
INTERNET_FLAG_KEEP_CONNECTION |
INTERNET_FLAG_NO_AUTO_REDIRECT |
INTERNET_FLAG_NO_COOKIES |
INTERNET_FLAG_NO_CACHE_WRITE |
INTERNET_FLAG_NO_UI |
INTERNET_FLAG_RELOAD;
CIHandle hReq = HttpOpenRequest(hConn,
"POST",
"upload.php",
"HTTP/1.0",
NULL,
NULL,
dwOpenRequestFlags,
NULL);
ZString strBoundary = "---------------------------autoupdater";
ZString strContentHeader = "Host: www.mydomain_at_powweb.com\r\n"
"Content-Type: multipart/form-data; boundary=";
strContentHeader+=strBoundary;
HttpAddRequestHeaders(hReq, strContentHeader, strContentHeader.length(), HTTP_ADDREQ_FLAG_ADD);
ZString strHeaders;
strHeaders.precache(16384);
sprintf(strHeaders,
"--%s\r\n"
"Content-Disposition: form-data; name=\"userfile\"; "
"filename=\"test.raw\"\r\n"
"Content-Type: application/octet-stream\r\n\r\n",
(LPCTSTR)strBoundary);
tCharSeq s;//this is a just a dynamic array of bytes;
//
// append headers and file to request:
//
s.precache(16384);
s.append(strHeaders.length(), strHeaders);
//append with file data:
s.append(2000, szRawData); //<------------------- depending on this size, SendRequest fails.
//trailing end of data:
s.append(4,"\r\n--");
s.append(strBoundary.length(), (LPTSTR)strBoundary);
s.append(4,"--\r\n");
InternetSetOption(hReq, INTERNET_OPTION_USERNAME, "username\0", 9);
InternetSetOption(hReq, INTERNET_OPTION_PASSWORD, "password\0", 9);
if (!HttpSendRequest(hReq, NULL, 0, (void*)s.getBuffer(), s.length()))
return printf("HttpSendRequest failed: %li.\n", GetLastError());