проблема написания HTMLUnit скрипта для отправки формы YUI - PullRequest
0 голосов
/ 03 сентября 2011

Я хочу написать простой тестовый скрипт HTMLUnit для Дженкинса (бывший Хадсон). ИНФОРМАЦИЯ: Дженкинс использует библиотеку YUI Javascript. Библиотека YUI заменяет отправку формы пользовательской кнопкой. Сценарий просто создает новую работу в Jenkins.

начать Дженкинс: java -jar jenkins.war

Текущие версии HTMLUnit больше не поддерживают form.submit и требуют, чтобы вы использовали button.click () для отправки формы. К сожалению, это не работает для Дженкинса (пример ниже не продвигает страницу и не создает работу, а остается на новой странице работы)

Я пытался найти решение или обходной путь в течение нескольких часов, но до сих пор не смог получить отправленную форму. Надеюсь, кто-нибудь нашел решение и дал мне знать.

Вот мой пример кода:

package example;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.HtmlButton;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlInput;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;

public class jenkins3 {
     public static void main(String args[]) {
        // create a new job in jenkins
        // home
        final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6);
        try {
            final HtmlPage page1 = webClient.getPage("http://localhost:8080");
            //assertEquals("Dashboard [Jenkins]", page1.getTitleText());

            // new job
            final HtmlAnchor new_job = page1.getAnchorByText("New Job");
            final HtmlPage page2 = new_job.click();

            // job name
            HtmlTextInput name_field = (HtmlTextInput) page2.getElementById("name");
            name_field.type("new job by htmlunit");

            // radio button
            final HtmlInput radio_freestyle = (HtmlInput) page2.getByXPath("//input[@value='hudson.model.FreeStyleProject']").get(0);
            radio_freestyle.click();
            Thread.sleep(10000);

            // OK button (submit form)
            final HtmlForm form = page2.getFormByName("createItem");
            //final HtmlSubmitInput button = (HtmlSubmitInput) form.getByXPath("//button").get(0);
            final HtmlButton button = (HtmlButton) form.getByXPath("//button").get(0);

            final HtmlPage page3 = button.click(); // !!!!! Form submit does not workstacko
            //assertEquals("Dashboard [Jenkins]", page3.getTitleText());
        }

        catch( Exception e ) {
            System.out.println( "General exception thrown:" + e.getMessage() );
            e.printStackTrace();
        }

        webClient.closeAllWindows();
    }
}

Ответы [ 4 ]

2 голосов
/ 19 сентября 2011

Хотя это может быть совершенно иным вопросом в вашем посту: я бы посоветовал отказаться от HTMLUnit.У меня была ошибка за ошибкой, в основном из-за того, что страницы, для которых я автоматизировал тесты, не всегда были на 100% действительными html (сторонние комбинированные запросы).Наконец я пошел искать в другом месте и обнаружил, что PhantomJS (привязки js к движку WebKit) гораздо лучше подходят.Для меня преимущества были очевидны: - нет необходимости в другом сервере приложений - гораздо проще и быстрее писать сценарии на JS, чем на Java - «реальный» движок мира более реалистичен, чем глючный эмулятор Это мой совет, Cheers

1 голос
/ 07 декабря 2012

Я нашел этот маленький трюк для работы. Перейдите на страницу входа в Jenkins с помощью HtmlUnit. Добавьте кнопку Отправить в форму входа. Установите соответствующие атрибуты для элемента Submit, включая значение «onclick». Нажмите на эту новую кнопку и альт! Вы вошли в систему.

Обратите внимание: если вы не заботитесь о безопасности, вы также можете сделать это:

webClient.getPage("https://yourdomain:8443/jenkins/j_acegi_security_check?j_username=yourUsername&j_password=yourPassword");

См. Ниже для первого метода.

Наслаждайтесь, Ник.

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

public class JenkinsLogin {

  final String urlValue = "https://<yourdomain>:8443/jenkins";
  private final String userName = "yourUsername";
  private final String password = "yourPassword";
  protected static final BrowserVersion BROWSER_VERSION_FIREFOX = new BrowserVersion(
          "Netscape", "5.0 (Windows)",
          "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0",
          (float) 1.2);
  private final WebClient webClient = new WebClient(BROWSER_VERSION_FIREFOX);

  public static void main(final String[] args) throws Exception {
    final JenkinsLogin jenkinsLogin = new JenkinsLogin();
    jenkinsLogin.login();
  }

  private void login() throws Exception {

    this.webClient.setThrowExceptionOnScriptError(false);

    HtmlPage page = this.webClient.getPage(this.urlValue + "/login");

    final HtmlForm form = page.getFormByName("login");
    form.getInputByName("j_username").setValueAttribute(this.userName);
    form.getInputByName("j_password").setValueAttribute(this.password);

    final HtmlElement createdElement = page.createElement("input");
    createdElement.setAttribute("type", "submit");
    createdElement.setAttribute("name", "submitIt");
    createdElement.setAttribute("onclick", "login.submit();");
    form.appendChild(createdElement);

    final HtmlElement submitButton = form.getInputByName("submitIt");
    page = submitButton.click();

    final HtmlElement loginField = page.getFirstByXPath("id('login-field')");
    if (loginField == null || !loginField.getTextContent().contains(this.userName))
      throw new RuntimeException("Unable to log on to Jenkins. ");
    System.out.println("Logged in! ");
  }
}
1 голос
/ 18 сентября 2011

HTMLUnit не включает поддержку для тестирования действий JavaScript.Возможно, вы не захотите переключать свою среду тестирования на этом этапе, но я бы рекомендовал использовать Selenium для этого типа тестирования.Он запускает фиктивный браузер и выполняет javascript, что позволяет делать подобные вещи.

0 голосов
/ 13 сентября 2011

заменяет

final HtmlButton button = (HtmlButton) form.getByXPath("//button").get(0);
final HtmlPage page3 = button.click()

с

form.submit((HtmlButton)last(form.getHtmlElementsByTagName("button")));

работа

...