我正试图摆脱这个:
@FindBy(xpath = "//div/span/img")
public WebElement addNew;
@FindBy(xpath = "//tr[2]/td[12]")
public WebElement save;
@FindBy(xpath = "//td/div/input")
public WebElement entryIdel;
@FindBy(xpath = "//textarea")
public WebElement authorFieldel;
@FindBy(xpath = "//td[3]/div/textarea")
public WebElement titleFieldel;
的是:
@FindBy(xpath = "//div/span/img")
public Button addNew;
@FindBy(xpath = "//tr[2]/td[12]")
public Button save;
@FindBy(xpath = "//td/div/input")
public InputBox entryIdel;
@FindBy(xpath = "//textarea")
public InputBox authorFieldel;
@FindBy(xpath = "//td[3]/div/textarea")
public InputBox titleFieldel;
我以前为每个元素创建了类,但当然没有任何反应。我如何创建我的元素类,以便我可以使用它而不是WebElement?
这里是InputBox的代码:
import org.openqa.selenium.WebElement;
public class InputBox {
protected WebElement element;
public WebElement getElement() {
return element;
}
public InputBox(WebElement element) {
this.element = element;
// TODO Auto-generated constructor stub
}
public void type(String input) {
clearText();
element.sendKeys(input);
}
public void clearText() {
element.clear();
}
public boolean isEditable() {
return element.isEnabled();
}
String getText() {
return element.getText();
}
String getValue() {
return element.getValue();
}
}
答案 0 :(得分:6)
创建FieldDecorator的新实现。
当您使用PageFactory时,您可能正在调用
public static void initElements(ElementLocatorFactory factory, Object page)
这将成为
public static void initElements(FieldDecorator decorator, Object page)
您的FieldDecorator的行为与DefaultFieldDecorator类似,只是在自定义类型中包装代理。
请参阅此处的课程[source]
答案 1 :(得分:0)
首先猜测:您是否一直在考虑更好的命名方案。在我的课堂上,按钮看起来像这样:
private WebElement loginButton;
在我的硒测试中,我发现,更好的方法是为每个页面设置Class,例如:
public Class LoginPage{
private WebElement loginButton;
private WebElement loginField;
private WebElement passwordField;
private WebDriver driver;
public LoginPage(WebDriver drv){
this.driver = drv;
}
public void login(String uname; String pwd){
loginButton = driver.findElement(By.xpath("//td/div/input"));
passwordField = driver...
loginField = driver...
loginField.sendKeys(uname);
passwordField.sendkeys(pwd);
loginButton.click();
}
}
然后测试看起来像这样:
public void testLogin(){
WebDriver driver = new FirefoxDriver();
driver.get("http://the-test-page.com/login.htm");
LoginPage loginPage = new LoginPage(driver);
loginPage.login("username", "password");
}
但是假设这对你不起作用,我有两个问题:
首先,您可以从WebElement扩展:
public class Button extends WebElement{
但即使您没有使用它们,也可能必须实现所有WebElement公共方法
然后作为第二个猜测你可以发送驱动程序并找到构造函数的路径
public class Button {
private WebDriver driver;
private WebElement button;
private WebDriver driver;
public Button(WebDriver driver, By by){
this,driver = driver;
button = findElement(by);
}
并且调用将是:
Button loginButton = new Button(driver, By.xpath("//td/div/input"));
顺便说一下,我的观点是,您正在使用WebDriver方法
修改强>
我发现,WebElement
是界面。所以你可以这样做:
public class WebButton implements WebElement{
但是你必须实现接口WebElement的所有抽象方法。
无论如何,当我这样做时,它允许我在我的其他课程中做这个注释:
@FindBy(xpath = "//textarea")
public WebButton testButton;
但我从未使用过这种方法,也无法保证它会做某些事情......
BTW如果有兴趣,我在这里粘贴了我的实施例子: