使用Selenium @ FindBy和继承的类

时间:2016-03-22 19:17:48

标签: java selenium inheritance xpath constructor

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

我想做点什么



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




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

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

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

哦,这是用Java和Eclipse完成的

2 个答案:

答案 0 :(得分:0)

应该指出,由于您的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);
    ....

之前从未尝试过,但我认为它可能有用。

答案 1 :(得分:0)

您可以尝试使用您的超类作为抽象类的template method pattern,它定义抽象方法以返回WebElements的选择器。子类将包含WebElements的特定于类的@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");
    }
}