Подтвердить что ты не робот

Самый простой способ "просмотреть" страницу и отправить форму в Java

Что мне нужно сделать, это перейти на веб-страницу, войти в систему, а затем перейти на другую веб-страницу на этом сайте, для которой требуется, чтобы вы вошли в систему, поэтому необходимо сохранить файлы cookie. После этого мне нужно щелкнуть элемент на этой странице, в котором я бы заполнил форму и получил сообщение о том, что веб-страница вернется ко мне. Причина, по которой мне нужно фактически перейти на страницу и нажать кнопку, так как предположим, что просто перейти непосредственно к ссылке - это то, что вам присваивается идентификатор сеанса каждый раз, когда вы входите в систему и щелкаете по ссылке, и ее всегда разные. Кнопка выглядит так: это не нормальная ссылка href:

<span id=":tv" idlink="" class="sA" tabindex="0" role="link">Next</span>

В любом случае, что было бы самым простым способом сделать это? Спасибо.

Обновление: После попытки использования HTMLunit и других браузеров без браузера, похоже, что это происходит, используя что-либо "без головы". Еще одна вещь, которую я недавно узнал об этой странице, - это то, что весь HTML находится в каком-то странном формате... Его все внутри тега script. Вот пример.

"?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, который я написал выше для кнопки, но не при создании источника просмотра. В принципе, мне нужно будет использовать какой-то графический интерфейс и пользователь должен перейти к ссылке, а затем заполнить эту информацию. Кто-нибудь знает, как я могу это сделать? Спасибо.

4b9b3361

Ответ 1

Это должно быть возможным в Селене, как отмечали другие.

Я использовал Selenium для входа в систему, затем сканировал сайт и обнаружил каждое изменение значений для каждой формы на сайте (30+ форм). Эти значения позже используются для заполнения и отправки формы с конкретным рассмотрением значений. Этот сайт был очень JS/jQuery тяжелым, и я использовал Selenium встроенную поддержку javascript-исполнителя, селекторов css и XPath для выполнения этого.

Я реализовал HtmlUnit и HttpUnit как более быстрые альтернативы, но обнаружил, что они не так надежно, как Selenium, с учетом семантики JS сайта, на котором я выполнял сканирование.

Трудно дать вам код о том, как его выполнить, потому что реализация Selenium будет довольно специфичной для страницы, и я не могу смотреть на страницу, которую вы кодируете, чтобы выяснить, что происходит с этой кнопкой script мусор. Тем не менее, у меня есть некоторые, возможно, соответствующие фрагменты кода selenium code (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 за интерфейсами может помочь.

Ссылка Anew опубликовала хорошую отправную точку, и хороший ol 'StackOverflow имеет ответы на любую проблему Selenium.

Ответ 3

На странице входа в систему просмотрите форму HTML, чтобы увидеть URL-адрес, на который он указывает, и параметры URL-адреса. Затем запросите URL-адрес с теми же параметрами, которые заполнены с правильной информацией, и не забудьте сохранить все заголовки файлов cookie для отправки на вторую страницу. Затем используйте html-парсер, чтобы найти свою ссылку. Есть несколько html-парсеров, доступных на sourceforge, и вы даже можете попробовать java, встроенные в синтаксические анализаторы xml, хотя, если на сайте есть даже крошечная ошибка HTML, они сбой.

EDIT не заметил, что это не нормальная ссылка. В этом случае вам нужно будет посмотреть на сайт javascript, чтобы узнать, куда ведет ссылка. Если для ссылки требуется javascript для запуска, она становится более сложной. Java не может выполнить браузер javascript, но я нашел библиотеку под названием "родной свинг" DJ, которая включает класс веб-браузера, который вы можете добавить в jframes. Он использует ваш собственный браузер для рендеринга и запускает javascript.

Ответ 4

Вместо того, чтобы пытаться просматривать программно, попробуйте выполнить запрос на вход и сохранить файлы cookie, а затем установите их в следующем запросе на сообщение формы.

Ответ 5

HTMLUnit довольно плохо при обработке JavaScript, Rhino JS-библиотека часто производит ошибки (на самом деле ошибки не являются исключением). Я бы посоветовал использовать Selenium, что в основном является основой для управления безгласными браузерами (хром, firefox).

Для вашего вопроса следующий код выполнит работу

selenium.open(myurl);
selenium.click("id=:tv");

Затем вам нужно дождаться загрузки страницы

selenium.waitForPageToLoad(someTime);

Ответ 6

Я бы порекомендовал 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());    

Я надеюсь, что этот базовый пример поможет вам!