2016-08-23 12 views
0

キュウナフィーチャファイルのWebElement(文字列ではなく)を対応するステップ定義に渡そうとしています。キュウリのフィーチャからステップ定義にWebElementパラメータを渡す

Scenario: Test 
    Given I want to click "myWebElement" 

対応するステップの定義は次のようになります。

@Given("^I want to click (.*)$") 
    public void Test(WebElement we) { 
     we.click(); 
    } 

実行時に、私は次のトレースを取得:

cucumber.runtime.CucumberException: Don't know how to convert ""myWebElement"" into org.openqa.selenium.WebElement. 
Try writing your own converter: 

@cucumber.deps.com.thoughtworks.xstream.annotations.XStreamConverter(WebElementConverter.class) 
public class WebElement {} 

    at cucumber.runtime.ParameterInfo.convert(ParameterInfo.java:150) 
    at cucumber.runtime.StepDefinitionMatch.transformedArgs(StepDefinitionMatch.java:68) 
    at cucumber.runtime.StepDefinitionMatch.runStep(StepDefinitionMatch.java:37) 
    at cucumber.runtime.Runtime.runStep(Runtime.java:299) 
    at cucumber.runtime.model.StepContainer.runStep(StepContainer.java:44) 
    at cucumber.runtime.model.StepContainer.runSteps(StepContainer.java:39) 
    at cucumber.runtime.model.CucumberScenario.run(CucumberScenario.java:44) 
    at cucumber.runtime.model.CucumberFeature.run(CucumberFeature.java:165) 
    at cucumber.api.testng.TestNGCucumberRunner.runCucumber(TestNGCucumberRunner.java:63) 
    at cucumber.api.testng.AbstractTestNGCucumberTests.feature(AbstractTestNGCucumberTests.java:21) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80) 
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:714) 
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901) 
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231) 
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) 
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:744) 

がために書くことができる機能がありますように」コンバータ"?

ありがとうございました。

+0

WebElementをステップ定義に渡すのではなく、機能ファイルの文字列を渡しています。その文字列パラメータがIDか名前か他のセレクタかどうかによって異なります。とにかく、RemoteWebElementクラスに空のコンストラクタだけがあるので、Transformerジェネリッククラスを拡張する必要があります。 – Grasshopper

+0

私の場合、WebElementはページオブジェクトクラスに存在する識別子です。言い換えれば:@FindBy(css = "input#ButtonClear")public WebElement ClearButton;私は機能ファイルから "ClearButton"を渡しています – rs79

答えて

2

まず、WebElementをパラメータとしてBDDフレームワークに渡す必要があるかどうかを自分で尋ねる必要があります。 BDDテストフレームワークは通常受け入れテストに使用されるため、パラメータはステークホルダーによっても分かりやすいものでなければなりません。

今、あなたの答えに来るために、キュウリはこれを達成するためにいわゆるトランスフォーマーを使います。キュウリのドキュメントから撮影:

パブリック抽象クラスの変圧器は、オブジェクトが cucumber.deps.com.thoughtworks.xstream.converters.SingleValueConverter は、カスタムタイプにステップ定義引数の変換を可能に実装して拡張し、 は、フル与えますその型がインスタンス化される方法を制御します。

次ガーキンのステップを考えてみましょう:考える

今日の日付は、例として「1985年10月3日」で、「1985年10月3日」我々は キュウリの部分文字列を変換したいとしましょうのインスタンスに org.joda.time.LocalDateクラス:

@Given("today's date is \"(.*)\"") 
public void todays_date_is(LocalDate d) { 
} If the parameter's class has a constructor with a single String or Object argument, then Cucumber will instantiate it without 

任意の前置き。しかし、この場合はあなたに何を与えてくれないかもしれません 。あなたのロケールによっては、日付は10月3日か3月10日です!

これは、カスタムトランスを使用できる場合です。また、パラメータークラスに1つの StringまたはObject引数を持つコンストラクターがない場合は、 を実行する必要があります。ジョダ時間例:

@Given("today's date is \"(.*)\"") 
public void todays_date_is(@Transform(JodaTimeConverter.class) LocalDate d) { 
} And then a JodaTimeConverter class: 


public static class JodaTimeConverter extends Transformer<LocalDate> { 
    private static DateTimeFormatter FORMATTER = DateTimeFormat.forStyle("S-"); 

    &#064;Override 
    public LocalDate transform(String value) { 
     return FORMATTER.withLocale(getLocale()).parseLocalDate(value); 
    } 
} An alternative to annotating parameters with Transform is to annotate your class with XStreamConverter: 

@XStreamConverter(MyConverter.class) 
public class MyClass { 
} This will also enable a DataTable to be transformed to a List<MyClass;> 

私はWebElementタイプでそれを自分自身を試していないが、原理は同じです。 詳細情報はhereです。

+0

ありがとうございました。私はTransformerを作成しますが、StringをWebElement識別子に変換するという固有の問題は依然として残ります。 – rs79

+0

それはあなたのカスタムタイプのために働くように設計されているので、あなたの詳細なコンバータをもっと調べたいかもしれません。基本的に単純な戻り値driver.findElement(By.id(idVariable));トリックを行う必要があります。 – Cosmin

+0

ドライバオブジェクトをどのように渡す必要がありますか? – rs79

関連する問題