我有几个继承的类都有类似的web元素。只是在每个子类中,元素的实际xpath是不同的。我想要做的所有交互在所有子类中是相同的,除了xpath。
我想做点什么
@FindBy(xpath = *somehow passed in constructor from subclass*)
private WebElement searchBox;

在超类中。然后我可以让我的方法对传递给它的元素起作用。我不认为我可以从子类传递元素,因为元素将是动态的,这将是静态完成的(或者只是一次,元素可能会改变)。
我无法在超类中定义xpath,因为每个子类中的xpath都不同。
我将不胜感激任何建议。我想我可以传递字符串并在必要时执行我自己的查找(driver.findElement(By.xpath(...))
哦,这是用Java和Eclipse完成的
答案 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");
}
}