我正在尝试使用页面工厂 @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']")
最佳答案
答案是实现一个 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;
关于java - Selenium 网络驱动程序 : Page factory initialization using paths relative to other elements?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24251739/