一尘不染

Selenium Webdriver:使用相对于其他元素的路径进行页面工厂初始化?

selenium

我正在尝试使用页面工厂@FindBy注释在Selenium
Webdriver中编写页面对象。该页面对象用于边栏,并且以这种方式初始化了包含该页面对象需要与之交互的所有元素的父WebElement:

@FindBy (xpath = "//div[contains(@class,'yui3-accordion-panel-content') and child::div[.='Sidebar']]")
WebElement sidebar;

然后,我想要相对于此sidebar元素的搜索输入。有没有办法做这个参考sidebar元素?我可以将整个路径复制并粘贴到开头:

@FindBy (xpath = "//div[contains(@class,'yui3-accordion-panel-content') and child::div[.='Sidebar']]//input[@id='search']")

但是我宁愿使它相对于第一个元素。这样有可能吗?

@FindBy (parent = "sidebar", xpath = ".//input[@id='search']")

对@FindBy注释selenium文档是有点欠缺......


阅读 259

收藏
2020-06-26

共1个答案

一尘不染

回答我自己的问题。

答案是实现一个ElementLocatorFactory,该元素允许您提供搜索上下文(含义是驱动程序或WebElement)。

public class SearchContextElementLocatorFactory
        implements ElementLocatorFactory {

    private final SearchContext context;

    public SearchContextElementLocatorFactory(SearchContext context) {
        this.context = context;
    }

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

然后,在实例化页面对象时,使用此定位器工厂。

WebElement parent = driver.findElement(By.xpath("//div[contains(@class,'yui3-accordion-panel-content') and child::div[.='Sidebar']]"));
SearchContextElementLocatorFactory elementLocatorFactory = new SearchContextElementLocatorFactory(parent);
PageFactory.initElements(elementLocatorFactory, this);

现在您的@FindBy注释将相对于parent。例如,获取主侧边栏WebElement

@FindBy(xpath = ".")
WebElement sideBar;
2020-06-26