Самый простой способ "перейти" на страницу и отправить форму в Java
Что мне нужно сделать, это перейти на веб-страницу, войти в систему, а затем перейти на другую веб-страницу на этом сайте, которая требует, чтобы вы вошли в систему, поэтому он должен сохранять куки. После этого мне нужно щелкнуть элемент на этой странице, в котором я бы заполнил форму и получил сообщение, которое веб-страница возвращает мне. Причина, по которой мне нужно на самом деле перейти на страницу и щелкнуть по кнопке, как предполагалось, чтобы просто перейти непосредственно к ссылке, заключается в том, что вам присваивается идентификатор сеанса каждый раз, когда вы входите в систему и нажимаете на ссылку, и она всегда отличается. Кнопка выглядит следующим образом, это не нормальная ссылка href:
<span id=":tv" idlink="" class="sA" tabindex="0" role="link">Next</span>
Во всяком случае, что было бы самым простым способом сделать это? Благодарю.
Обновление: после попытки HTMLunit и других безголовых библиотек браузера, кажется, что это происходит с использованием чего-то "безголового". Еще одна вещь, которую я недавно узнал об этой странице, заключается в том, что весь HTML-код находится в каком-то странном формате... Все внутри тега скрипта. Вот образец.
"?ui\x3d2\x26view\x3dss\x26mset\x3dmain\x26ver\x3d-68igm85d1771\x26am\x3d!Zsl-0RZ-XLv0BO3aNKsL0sgMg3nH10t5WrPgJSU8CYS-KNWlyrLmiW3HvC5ykER_n_5dDw\x26fri"],"http://example.com/?ctx\x3d%67mail\x26hl\x3den",,0,"Gmail","Gmail",[["us","c130f0854ca2c2bb",[["n"],["m","New features!"],["u"],["k","0"],["p","1000:500000,10,200000,5,100000,3,75000,2,0,1"],["h","https://survey.googleratings.com/wix/p1679258.aspx?l\x3d1033"],["at","query,5,contacts,5,adv,5,cf,5,default,20"],["v","https://www.youtube.com/embed/Ra8HG6MkOXY?showinfo\x3d0"],
Когда я проверяю элемент на кнопке, появляется HTML-код, который я разместил выше для кнопки, но не при просмотре исходного кода. По сути, мне нужно использовать какой-то графический интерфейс, и пользователь должен перейти по ссылке, а затем программа заполнить информацию. Кто-нибудь знает, как я могу это сделать? Благодарю.
6 ответов
Это должно быть возможно в Selenium, как отметили другие.
Я использовал Selenium для входа в систему, а затем для сканирования сайта и обнаружения каждой перестановки значений для каждой формы на сайте (более 30 форм). Эти значения позже используются для заполнения и отправки формы с определенным перечнем значений. Этот сайт был очень тяжелым для JS/jQuery, и я использовал встроенную в Selenium поддержку javascript executor, селекторов css и XPath для достижения этой цели.
Я реализовал HtmlUnit и HttpUnit как более быстрые альтернативы, но обнаружил, что они не так надежны, как Selenium, учитывая семантику JS сайта, который я сканировал.
Трудно дать вам код о том, как это сделать, потому что ваша реализация Selenium будет зависеть от конкретной страницы, и я не могу посмотреть на страницу, для которой вы кодируете, чтобы понять, что происходит с этим мусорным скриптом кнопки. Тем не менее, я включил некоторые, возможно, соответствующие фрагменты кода селена (Java):
Element element = driver.findElements(By.id(value)); //find element on page
List<Element> buttons = parent.findElements(By.xpath("./tr/td/button")); //find child element
button.click();
element.submit() //submit enclosing form
element.sendKeys(text); //enter text in an input
String elementText = (String) ((JavascriptExecutor) driver).executeScript("return arguments[0].innerText || arguments[0].textContent", element); //interact with a selenium element via JS
Если вы кодируете похожие функции на разных страницах, то PageObjects за интерфейсами может помочь.
Ссылка, опубликованная заново, является хорошей отправной точкой, и у хорошего старого Stackru есть ответы практически на любые проблемы с Selenium.
Ознакомьтесь с 5-минутным руководством по началу работы для Selenium: http://code.google.com/p/selenium/wiki/GettingStarted
На странице входа в систему посмотрите HTML-код формы, чтобы увидеть URL-адрес, на который она отправляет сообщения, и параметры URL-адреса. Затем запросите этот URL с теми же параметрами, указав правильную информацию, и сохраните все заголовки файлов cookie для отправки на вторую страницу. Затем используйте html-парсер, чтобы найти вашу ссылку. В sourceforge есть несколько html-парсеров, и вы даже можете попробовать встроенные в xml-парсеры java, хотя, если на сайте есть даже небольшая html-ошибка, они будут давать сбой.
РЕДАКТИРОВАТЬ не заметил тот факт, что это не нормальная ссылка. В этом случае вам нужно будет посмотреть javascript сайта, чтобы увидеть, куда ведет ссылка. Если для ссылки требуется javascript, она становится более сложной. Java не может выполнять браузерный javascript, но я нашел библиотеку под названием DJ native Swing, которая включает класс веб-браузера, который вы можете добавить в jframes. Он использует ваш родной браузер для рендеринга и запуска JavaScript.
Вместо того, чтобы пытаться просматривать программно, попробуйте выполнить запрос на вход в систему и сохранить куки-файлы, а затем установить их в следующем запросе на пост формы.
HTMLUnit довольно плохо обрабатывает JavaScript, библиотека Rhino JS часто выдает ошибки (на самом деле никаких ошибок не является исключением). Я бы посоветовал использовать Selenium, который в основном является фреймворком для управления безголовыми браузерами (на основе Chrome, Firefox).
Для вашего вопроса, следующий код будет делать работу
selenium.open(myurl);
selenium.click("id=:tv");
Затем вам придется ждать загрузки страницы
selenium.waitForPageToLoad(someTime);
Я бы порекомендовал htmlunit в любой день. Это отличная библиотека.
Сначала проверьте их веб-страницу ( http://htmlunit.sourceforge.net/), чтобы запустить и запустить htmlunit. Убедитесь, что вы используете последний снимок (2.12 при написании этого)
Попробуйте эти настройки, чтобы игнорировать практически любые препятствия:
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_17);
webClient.getOptions().setRedirectEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setUseInsecureSSL(true);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getCookieManager().setCookiesEnabled(true);
Затем при загрузке вашей страницы, убедитесь, что вы ждете фоновый Javascript, прежде чем делать что-либо со страницей, например, отправлять форму входа в систему:
//Get Page
HtmlPage page1 = webClient.getPage("https://login-url/");
//Wait for background Javascript
webClient.waitForBackgroundJavaScript(10000);
//Get first form on page
HtmlForm form = page1.getForms().get(0);
//Get login input fields using input field name
HtmlTextInput userName = form.getInputByName("UserName");
HtmlPasswordInput password = form.getInputByName("Password");
//Set input values
userName.setValueAttribute("MyUserName");
password.setValueAttribute("MyPassword");
//Find the first button in form using name, id or xpath
HtmlElement button = (HtmlElement) form.getFirstByXPath("//button");
//Post by clicking the button and cast the result, login arrival url, to a new page and repeat what you did with page1 or something else :)
HtmlPage page2 = (HtmlPage) button.click();
//Profit
System.out.println(page2.asXml());
Я надеюсь, что этот базовый пример поможет вам!