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 回答