通过定位器获取PageFactory IWebElement

时间:2013-10-25 13:49:11

标签: c# webdriver selenium-webdriver

我有一种情况,我希望得到' 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"));

谢谢

2 个答案:

答案 0 :(得分:2)

这是不可能的,因为从来没有任何关于如何找到该元素的参考。当你致电.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;
        }
    }
}

答案 1 :(得分:-1)

感谢您的回复,但我使用Reflection来完成我想要的工作。

这是我在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初始化的元素。