kro*_*761 3 java pageobjects selenium-webdriver
我正在尝试将我的 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")) ;
}
Run Code Online (Sandbox Code Playgroud)
将父对象转换为 using@FindBy很容易:
@FindBy(name = "parent-id")
WebElement parentObj;
Run Code Online (Sandbox Code Playgroud)
基本上,如果可能的话,我想做这样的事情(我知道这不是真正的代码,这只是一个伪示例:
@FindBy(name = "parent-id")
WebElement parentObj;
@FindBy(parentObj.name = "child-id")
WebElement childObj;
Run Code Online (Sandbox Code Playgroud)
但是,有没有办法过定位的子元素中使用的父元素@FindBy?。我需要这样做,因为我的目标是页面上的特定元素,这些元素可能与页面上的其他元素共享相同的名称或类名。谢谢!
如果不编写 custom ,您尝试做的事情就不容易实现ElementLocatorFactory。
首先,我真的建议使用XPath。这将使获取以下内容变得容易:
3rd<table>就像这样:@FindBy(xpath = "\\table[3]")和... 3rd table 中的
2nd<li>就像这样:@FindBy(xpath = "\\table[3]\li[2]")。
但是如果你真的想用更短的@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);
}
}
Run Code Online (Sandbox Code Playgroud)
带有一个元素的类将为您提供上下文:
public class Parent {
@FindBy(name = "myTable")
WebElement table;
public WebElement getTable() {
return this.table;
}
}
Run Code Online (Sandbox Code Playgroud)
它的孩子:
public class Child {
@FindBy(name = "particular")
WebElement specialTableListElement;
}
Run Code Online (Sandbox Code Playgroud)
用法:
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);
Run Code Online (Sandbox Code Playgroud)