【问题标题】:How to find a WebElement by another WebElement using Page Factory如何使用页面工厂通过另一个 WebElement 查找 WebElement
【发布时间】:2017-03-16 18:12:47
【问题描述】:

对源代码进行了简短的扫描,不确定什么是最佳实践。

例如,假设我有一个页面对象“DummyPage”,它有两个面板元素TopPanelBottomPanel。每个面板都有一些元素,这些元素是由TopPanel.FindElement() 而不是driver.FindElement() 找到的。如何为此申请页面工厂?

我知道PageFactory.InitElements(ISearchContext, Object) 接受ISearchContext,但是,我不确定如何将它用于一个类中的页面和面板元素。

public class DummyPage {

    private IWebDriver driver;

    public DummyPage(IWebDriver driver) {
        this.driver = driver;
    }

    public IList<IWebElement> DummyLinks {
        get { return driver.FindElements(By.CssSelector(".some-dummy-links")); }
    }

    public IWebElement TopPanel {
        get { return driver.FindElement(By.Id("top-panel")); }
    }

    public IWebElement BottomPanel {
        get { return driver.FindElement(By.Id("bottom-panel")); }
    }

    public IWebElement FooInTopPanel {
        get { return TopPanel.FindElement(By.CssSelector(".something")); }
    }

    public IWebElement FooInBottomPanel {
        get { return BottomPanel.FindElement(By.CssSelector(".something")); }
    }
}

public class DummyPageWithPageFactory {

    public DummyPageWithPageFactory(IWebDriver driver) {
        PageFactory.InitElements(driver, this);
    }

    [FindsBy(How = How.CssSelector, Using = ".some-dummy-links")]
    public IList<IWebElement> DummyLinks { get; private set; }

    [FindsBy(How = How.Id, Using = "top-panel")]
    public IWebElement TopPanel { get; private set; }

    [FindsBy(How = How.Id, Using = "bottom-panel")]
    public IWebElement BottomPanel { get; private set; }

    //public IWebElement FooInTopPanel { get; private set; }
    //public IWebElement FooInBottomPanel { get; private set; }
}

如果我对所有实例使用driver.FindElement() 并连接所有定位器,我可能会面临另一种情况,即所有定位器都太长并且我无法在 C# 属性中使用变量。

[FindsBy(How = How.CssSelector, Using = "#top-panel .blah .blah .super-long-blah .something")]
[FindsBy(How = How.CssSelector, Using = "#top-panel .blah .blah .super-long-blah .something-new")]
[FindsBy(How = How.CssSelector, Using = "#bottom-panel .blah .blah .super-long-blah .something")]

【问题讨论】:

  • 有一个可用的 ByChained 类,可以让你链接你的 Bys。不确定这是否是您要查找的内容,并且我不确定 C# 语法(尽管我知道它在其中),因为我是 Java 人。如果没有别的,希望是一个有用的指针。
  • @Ardesco:是的,我知道那个类,但是,我认为ByChained 的用法看起来像driver.FindElement(new ByChained(By.Id("top-panel"), By.ClassName("something")));,我不确定这将如何帮助“页面工厂”。但实际上,这个类在 PageObjects 命名空间中,这个问题是特定于语言的。
  • 在 Java 世界中,您可以使用 @FindBys(@FindBy("locator1"), @FindBy("locator2"))。我假设 .NET 绑定有类似的语法,因为 ByChained 是作为 Java 页面工厂代码的一部分引入的。我承认我在这里做了很多假设,并假设 .NET 绑定与 Java 绑定大致相似。
  • @Ardesco:是的,我在这里看到了不同之处。 Java 的 @FindBys 允许 By 参数,而我需要找到类似于放入 C# [FindsBy()] 的东西。我注意到它允许CustomFinderType,但是,在这种情况下,我似乎需要创建自己的继承By 的类,并且它接受string,这无助于我缩短定位器。顺便说一句,谢谢队友。
  • 从 TopPanel.FindElement() 和 BottomPanel.FindElement() 获取的元素是否已修复?

标签: c# selenium webdriver selenium-webdriver


【解决方案1】:

看到这个example

[FindsBy(How = How.Name, Using = "anElementName", Priority = 0)]
[FindsBy(How = How.Name, Using = "differentElementName", Priority = 1)]
public IWebElement thisElement;

【讨论】:

  • 嗨,欢迎来到 Stack Overflow!看看这个page about formatting,看看你是否可以修复答案中的链接。如果链接有效,它将对人们更有用,并且更易于阅读。
猜你喜欢
  • 2018-08-02
  • 2019-12-13
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 2021-10-13
相关资源
最近更新 更多