1

要素を検索するために使用される「By」ロケーターを取得したい状況があります。PageFactoryを使用して要素を初期化しました。

このようなもの:

[TestClass]
public class Page
{
    private IWebDriver _driver;

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

    public Page(IWebDriver driver)
    {
        _driver = driver;
        PageFactory.InitElements(_driver, this);
    }

    public void DoSomething()
    {
        By locator = GetLocator(TxtUsername); //Not real function
        IWebElement e = _driver.FindElement(locator);
    }
}

GetAttribute から Id を取得できることはわかっていますが、XPath を使用して要素を見つけた場合や、単に要素に ID がない場合は解決しません。

このような:

By locator = By.Id(element.GetAttribute("id"));

ありがとうございました

4

2 に答える 2

3

その要素をどのように見つけたかについての参照が保持されていないため、これは単純に不可能です。呼び出すときは.FindElement、要素を見つけて返すことだけに関心があり、それをどのように見つけたかを思い出すことにはあまり関心がありません。

あなたの唯一の解決策は、それを記録するクラスを作成して、参照を自分で保持することです。

何かのようなもの:

public class SeleniumElement : IWrapsElement
{
    private IWebElement cachedElement;

    private By mechanismUsed;

    public SeleniumElement(IWebElement element, By locatorUsed)
    {
        mechanismUsed = locatorUsed;
        cachedElement = element;
    }

    public IWebElement WrappedElement
    {
        get
        {
            return cachedElement;
        }
    }
}
于 2013-10-25T15:42:35.993 に答える
-1

返信ありがとうございますが、リフレクションを使用して、私が望んでいたことを正確に行うことができました。

C# での私の実装は次のとおりです。

    private By GetLocator(IWebElement element)
    {
        // Retrieve a FieldInfo instance corresponding to the field
        FieldInfo field = element.GetType().GetField("bys", BindingFlags.Instance | BindingFlags.NonPublic);

        // Retrieve the value of the field, and cast as necessary
        return ((List<By>)field.GetValue(element))[0];
    }

注:この実装は、PageFactory で初期化された要素に対してのみ機能します。

于 2013-10-25T15:55:34.397 に答える