2016-04-27 9 views
0

にIWebElementを変換しようとすると、私はBy要素にIWebElementを変換するために、このメソッドにそれを渡ししようとしています私は、ページオブジェクトによって要素

[FindsBy(How = How.Id, Using = "buttonSignIn")] public IWebElement BtnSignin { get; set; }

を考えてみましょう。

public void MoveAndClick(IWebElement element) 
{ 
    var findElement = driver.FindElement((By)element); 

    Actions act = new Actions(driver); 
    act.MoveToElement(findElement); 
    act.Click(findElement); 
    act.Perform(); 
} 

は、私は私のテストは、私はBy要素にIWebElementを変換する方法を理解する必要が動作するためにコードのこの作品は、しかし、By要素に要素をキャストせずに動作することを知っています。

これを実行すると、例外エラーが発生します。誰にもこれに対する簡単な解決策がありますか?

+1

を行きますhttp://stackoverflow.com/a/31677984/2246511 – jibbs

答えて

1

短い答えです。 Seleniumの開発者は、これに有用なユースケースがないと判断しました。

0

あなたは要素のユニークな属性を取得使用することができます。

IWebElement element = driver.FindElements(/* Example */By.Id("ID")); 
String id = item.GetAttribute("id"); 
By elemBy = By.Id(id); 
+0

ID属性がない場合はどうなりますか? –

1

セレンは、私たちにIWebElementのセレクタを提供しますが、JavaScriptを使用してセレクタを作成することも可能であるしません。

public static By ConvertToBy(this IWebElement element) 
{ 
    if (element == null) throw new NullReferenceException(); 

    var attributes = 
     ((IJavaScriptExecutor) SeleniumWebDriver.Driver).ExecuteScript(
      "var items = {}; for (index = 0; index < arguments[0].attributes.length; ++index) { items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value }; return items;", 
      element) as Dictionary<string, object>; 
    if (attributes == null) throw new NullReferenceException(); 

    var selector = "//" + element.TagName; 
    selector = attributes.Aggregate(selector, (current, attribute) => 
     current + "[@" + attribute.Key + "='" + attribute.Value + "']"); 

    return By.XPath(selector); 
} 

それをタグ名とすべてのattrの名前と値を持つXPathが作成されます。"//a[@class='test test-test'][@id='test-id'][@custom='custom-value']"

注意:トランスに正しい方法がないIWebElementをByに入れると、ページ内に同じタグ名とattrsの名前と値を持つ別の要素がある場合は、重複した結果を返すことがあります。

1

私はそれをお勧めしませんが、あなたはリフレクションを使ってこれを実現することができます -

あなたのメソッド内

を、あなたのIWebElement「要素」参照を使用して:

//Get the RealProxy of the element 
var elementProxy = System.Runtime.Remoting.RemotingServices.GetRealProxy(element); 

//Get the Bys from the RealProxy:  
var bysFromElement = (IReadOnlyList<object>)elementProxy 
    .GetType() 
    .GetProperty("Bys", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public)? 
    .GetValue(elementProxy); 

//Convert bysFromElement to a list of strings for manipulation, or convert into a list of By objects, i.e.:  
var bys = new List<string>(); 
if (bysFromElement != null) 
{ 
    bys.AddRange(bys.Select(@by => @by.ToString())); 
} 

、そこにあなたが