2011-09-03 15 views
0

Jenkins(旧ハドソン)向けの簡単なHTMLUnitテストスクリプトを作成したいと思います。情報:JenkinsはYUI Javascriptライブラリを使用します。 YUIライブラリは、フォーム送信をカスタムボタンに置​​き換えます。このスクリプトはJenkinsで新しい仕事を作成するだけです。YUIフォーム送信のHTMLUnitスクリプトの作成に関する問題

開始ジェンキンス:HTMLUnitの

現在のバージョンでは、任意のより多くのform.submitをサポートし、フォームの提出用)button.clickを(使用する必要はありません-jar jenkins.war のjava。残念ながら、これはJenkinsでは機能しません(下のサンプルはページを進めずにジョブを作成して新しいジョブページに残ります)

解決策や回避策を見つけるのに数時間掛かりましたが、提出されたフォームを入手してください。うまくいけば、誰かが解決策を見つけて私に知らせてくれるでしょう。ここで

は私のサンプルコードです:

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(); 
    } 
} 
+0

ブラウザでページを見たときにフォームを送信するにはどうすればよいですか? HtmlUnitは、通常、人間がページとのやり取りを複製しようとしますが、ブラウザ経由で行うことはできないDOMレベルの操作は複製しません。 –

+0

上記のように、JenkinsはYUI Javascriptライブラリを使用しています。 YUIライブラリは、フォーム送信をカスタムボタンに置​​き換えます。このボタンはフォームの送信アクションをトリガし、フォームの送信前にすべての入力フィールドを1つの隠しフィールドにマングリングするような舞台裏でいくつかのマジックを行います。 – mark

答えて

2

あなたのsenerioではこれが完全に問題にならないかもしれませんが、私はHTMLUnitをあきらめることを勧めます。バグの後にバグがありました。主に、私がテストを自動化してきたページが常に100%有効なhtml(サードパーティのピギーバックリクエスト)であるとは限りません。ついに私は別の場所を見て、PhantomJS(WebKitエンジンへのバインディング)がはるかに適していることを発見しました。 は、私にとっての利点は明らかではなかった: - Javaの よりスクリプトJSにはるかに簡単かつ迅速 - - 他のアプリケーションサーバ は必要「本物」-worldエンジンは私の助言厥1 バギーエミュレータよりも現実的である、 乾杯。

0

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

仕事で

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

を交換していますか?

+0

いいえ、そうではありません。元の質問で述べたとおり、現在のバージョンのHTMLUnitはフォームの送信をサポートしていません。 – mark

+0

あなたはYUI Connectionマネージャを使用したことがありますか? http://developer.yahoo.com/yui/connection/#forms – kf0l

+0

私はそれがそのままでジェンキンスをテストしていると私はそれを変更するつもりはないことはあなたには明らかではないという印象を持っています。それはテスト関連の問題であり、開発ではありません。 – mark

1

HTMLUnitには、javascriptアクションのテストのサポートは含まれていません。この時点でテストフレームワークを切り替えたくないかもしれませんが、この種のテストにはSeleniumを使用することをお勧めします。それは模擬ブラウザを実行し、javascriptを実行するので、この種のことを行うことができます。

1

私はこの小さなトリックが働くことを発見しました。 HtmlUnitを使用してJenkinsのログインページに移動します。ログインフォームに[送信]ボタンを追加します。 "onclick"値を含む適切な属性をSubmit要素に設定します。この新しいボタンとビオラをクリックしてください!あなたはログインしている

注意を、あなたはセキュリティが心配でないなら、あなたもこれを行うことができます。

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! "); 
    } 
} 
関連する問題