2

このリンク: http://www.codeproject.com/Articles/19911/Dynamically-Invoke-A-Method-Given-Strings-with-Met は、メソッド名と文字列変数の型がある場合にメソッドを呼び出す方法を明確に説明しています.

WatiNでac#プロジェクトを作っています。私が使用するすべての WatiN メソッドは同じ形式です。

例: *( ById,.ByClass..; 接続する必要がありますが、太字に設定できませんでした :s )

  • browser.**TextField**(Find.By **Id**("name")).**TypeText**("my name");
  • browser.**Span**(Find.By **Class**("main_title")).**Click(**);
  • browser.**Link**(Find.By **Id**("mid_link")).**Click(**);

ご覧のとおり、これは常に可変の 3 つのメソッドで構成されています。タグ、タイプ、検索、アクションの文字列プロパティで構成されるクラス webElement を作成しました。

例のどこに -> tag = "TextField"; type = "Id", search = "name"; action = "TypeText".

Web 要素を動的に取得するために、適切なメソッドを動的に呼び出そうとする WebHandler クラスを作成しました。

したがって、メイン クラスにはすべての webElement オブジェクトのリストがあり、特定の時間に適切なオブジェクトを WebHandler クラスに渡すことができます。Webhandler クラスは、各要素を動的に呼び出す必要があります。指定された URL と同じ呼び出しメソッドを使用するため、それを呼び出すコードは次のとおりです。

クラス WebHandler:

private IE browser = new IE("google.com");

public void method(WebElement webElement)
{
     //Get the findBy dynamically | this works
     WatiN.Core.Constraints.Constraint findBy =
                (WatiN.Core.Constraints.Constraint)InvokeMethod("WatiN.Core.Find, WatiN.Core", "By" + webElement.Type, webElement.Search); //where type = "Id" and search = "name"

     //Get the tag (like textfield, link, span) dynamically | this does not work
     Type aType = Type.GetType("WatiN.Core." + webElement.Tag, "WatiN.Core") //how can I set the element variable to this type? aType element -> Does not work
     aType element = (WatiN.Core.TextField)InvokeMethod("this.browser", webElement.Tag, findBy); //tag = TextField

    element.TypeText("a name"); //same problem as above | so should be invoked
}

質問:

  1. 文字列バージョン "TextField" を変数として使用して、インスタンス クラス IE ( browser ) のメソッド ( TextField ) を動的に呼び出すにはどうすればよいですか? 別の言い回しは次のようになります:文字列バージョンの "browser" を使用して現在の変数 ( browser )を取得するにはどうすればよいですか?
  2. 変数要素のタイプを動的に設定するにはどうすればよいですか? したがって、webElement.Tag = Textfield の場合、型は WatiN.Core.TexField element = .. である必要があります (コードを参照)。

独自の考慮事項:

  1. 私が見つけた主な問題は、その型のインスタンスからではなく、型からしかメソッドを呼び出せないことです。とにかくこれを行う方法はありますか?
4

3 に答える 3

1

この行

Type aType = Type.GetType("WatiN.Core" + webElement.Tag)

の後にドットがありませんCore。名前空間のように見えるためCore、タグ名から分離する必要があります。

于 2012-12-28T16:19:11.087 に答える
0

これの要点は、必要なタイプを取得し、リフレクションを使用してメソッドを取得し、指定されたメソッドを呼び出してインスタンスを渡すことです。

したがって、次のようなものです。

    Type aType = Type.GetType(string.Format("WatiN.Core.{0}.WatiN.Core", webElement.Tag));
    MethodInfo method = aType.GetMethod("TextField");
    method.Invoke(this.browser, webElement.Tag, findBy);

ここでの重要なビットは次のとおりです。

  1. タイプを取得する
  2. メソッドを取得する
  3. 必要なインスタンスでメソッドを呼び出します

近道があります。あなたの質問に適切な詳細を持っていない可能性がありますが、それはあなたが望むものに近づくはずです.

于 2012-12-28T16:41:21.363 に答える
0

ほら、これを LINQPad にまとめましたが、多かれ少なかれ移植性があるはずです。

void Main()
{
    WatiN.Core.Browser theBrowser = new WatiN.Core.IE("google.com");
    Foo(theBrowser, "Id", "gbqfq", "TextField", "TypeText", "Search for this");
}

public void Foo(WatiN.Core.Browser browser, string findTypeBy, string search, string tagName, string elementMethodName, params object[] argsForMethod)
{
    var watinCoreAsm = Assembly.LoadWithPartialName("WatiN.Core");
    if(watinCoreAsm == null) return;

    var watinCoreTypes = watinCoreAsm.GetTypes();
    if(watinCoreTypes == null) return;

    var findType = watinCoreTypes.FirstOrDefault(type => type.Name == "Find");
    if(findType == null) return;

    var constraintInstance = findType.GetMethod("By" + findTypeBy, new Type[]{ typeof(string) }).Invoke(null, new[]{search});
    if(constraintInstance == null) return;

    var browserAccessor = browser.GetType().GetMethod(tagName, new Type[]{ constraintInstance.GetType() });
    if(browserAccessor == null) return;

    var resultElement = browserAccessor.Invoke(browser, new[]{ constraintInstance });
    if(resultElement == null) return;

    var elementMethod = resultElement.GetType().GetMethod(elementMethodName);
    if(elementMethod == null) return;

    elementMethod.Invoke(resultElement, argsForMethod);
}
于 2012-12-28T17:05:47.807 に答える