【问题标题】:Using Selenium@FindBy with a value from an inherited class将 Selenium@FindBy 与继承类中的值一起使用
【发布时间】:2016-07-09 20:44:35
【问题描述】:

我有几个继承的类,它们都有相似的 web 元素。只是在每个子类中,元素的实际xpath是不同的。我想做的所有交互在所有子类中都是相同的,除了 xpath。

我想做类似的事情

@FindBy(xpath = *somehow passed in constructor from subclass*)
private WebElement searchBox;

在超类中。然后我可以让我的方法作用于传递给它的元素。我不认为我可以从子类传递元素,因为元素将是动态的,并且这将静态完成(或者只是一次,元素可能会改变)。

我无法在超类中定义 xpath,因为每个子类中的 xpath 都不同。

如果有任何建议,我将不胜感激。我想我可以传递字符串并在必要时自行查找(driver.findElement(By.xpath(...))

哦,这是用Java和Eclipse来完成的

【问题讨论】:

    标签: java selenium inheritance xpath constructor


    【解决方案1】:

    应该指出,由于您的 WebElement 实例是私有的,那么我认为子类页面对象将无法访问这些 webelement 实例。如果您的 WebElement 被“保护”,那么您可以从子类访问它,并且如果您在同名的子类中声明了一个新变量,那么新变量将覆盖父类 AFAIK 中的变量。

    另外,你不能像你暗示的那样在构造函数中传递元素:相反,使用 PageFactory.initObjects(parentClass) 或类似的东西将它们加载到子类中。注释不能将变量作为参数,AFAIK。

    class HomePage extends ParentPage {
      public HomePage() {
        ParentPage pp = PageFactory.initElements(driver, ParentPage.class);
        HomePage hp = PageFactory.initElements(driver, this);
        ....
    

    以前从未尝试过,但我认为它可能会起作用。

    【讨论】:

    • 我正在尝试理解它,然后当我理解它们的作用时我会尝试它。我猜我还是个新手 ;-)
    【解决方案2】:

    您可以尝试template method pattern,其中您的超类是一个抽象类,它定义了抽象方法来为您的 WebElements 返回选择器。子类将包括 WebElement 的特定于类的 @FindBy() 定义。 (我不知道这是否可行……只是一个想法。)

    public abstract class MySuperClass {
        public abstract By getFooSelector(); 
        public void someMethodThatUsesFoo() {
            WebElement foo = driver.findElement(getFooSelector());
            ...
        }
    }
    
    public class MySubClass extends MySuperClass {
        public By getFooSelector() {
            return new By.ByXpath("foo/X/path");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多