如何实现@FindBy注释的用户类型?

时间:2012-02-28 08:27:36

标签: java selenium webdriver

我正试图摆脱这个:

@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();
}

}

2 个答案:

答案 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如果有兴趣,我在这里粘贴了我的实施例子:

http://pastebin.com/STr15UQd