繁体   English   中英

Selenium/PageFactory:使用父元素的@FindBy 查找子元素?

[英]Selenium/PageFactory: Find child elements using parent element's @FindBy?

我正在尝试将我的 selenium 测试转换为使用页面对象模型(以及扩展名 @FindBy)。 我有几个这样的对象定义:

public WebElement objectParent() {
    return driver.findElement(By.name("parent-id")) ;
}

public WebElement objectChild() {
    WebElement elem = objectParent();
    return elem.findElement(By.name("child-id")) ;
}

将父对象转换为使用@FindBy很容易:

@FindBy(name = "parent-id")
WebElement parentObj;

基本上,如果可能的话,我想做这样的事情(我知道这不是真正的代码,这只是一个伪示例:

@FindBy(name = "parent-id")
WebElement parentObj;

@FindBy(parentObj.name = "child-id")
WebElement childObj;

但是,有没有办法过针对使用父元素的子元素@FindBy? . 我需要这样做,因为我的目标是页面上的特定元素,这些元素可能与页面上的其他元素共享相同的名称或类名。 谢谢!

如果不编写自定义ElementLocatorFactory您尝试做的事情就不容易实现。

首先,我真的建议使用XPath 这将使获取以下内容变得容易:
第三个<table>就像这样: @FindBy(xpath = "\\\\table[3]")和...
第三个表中的第二个<li>就像这样: @FindBy(xpath = "\\\\table[3]\\li[2]")

但是如果你真的想用更短的@FindBy注释@FindBy ,你可以选择ElementLocatorFactory

public class FindByContextModifier implements ElementLocatorFactory {

    private final SearchContext context;

    public FindByContextModifier(final SearchContext context) {
        this.context = context;
    }

    public ElementLocator createLocator(final Field field) {
        return new DefaultElementLocator(context, field);
    }
}

带有一个元素的类将为您提供上下文:

public class Parent {
    @FindBy(name = "myTable")
    WebElement table;

    public WebElement getTable() {
      return this.table;
    }
}

它的孩子:

public class Child {
    @FindBy(name = "particular")
    WebElement specialTableListElement;
}

用法:

Parent parent = PageFactory.initElements(driver, Parent.class);
FindByContextModifier parentContext = new FindByContextModifier(parent.getTable());
Child child = new Child();
// This will look for the name "particular" inside the element with "myTable" name
PageFactory.initElements(parentContext, child);

上面提到的方法有效,但如果您使用的是 xpath,请确保您的“子”元素前面有一个.//以使其相对。

您不需要编写自定义ElemLocatorFactory ,只需使用org.openqa.selenium.support.pagefactory.DefaultElementLocatorFactory

Parent parent = PageFactory.initElements(driver, Parent.class);
DefaultElementLocatorFactory parentContext = new DefaultElementLocatorFactory(parent.getTable());
Child child = new Child();
PageFactory.initElements(parentContext, child);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM