将@FindBy与我自己的类一起使用,而不是使用WebElement

时间:2015-04-27 09:44:25

标签: java selenium-webdriver factory-pattern pageobjects findby

是否可以将@FindBy用于WebElement,但使用我自己的类?

我想让我的类与页面元素合作并覆盖其中的WebElement接口的一些方法。

所以我实现了这个类:

public class NamedElement implements WebElement {
    public boolean isDisplayed(){
        try{
            return element.isDisplayed();
        } catch (NoSuchElementException noElement) {
            return false;
        }
    }

并且想要声明这样的元素:

@FindBy(xpath = ".//a[contains(text(), 'Log in')]")
public NamedElement loginButton;

但我收到错误:

java.lang.IllegalArgumentException: Can not set lenovo.tests.page.NamedElement field lenovo.tests.page.NCBLoginPage.loginButton to com.sun.proxy.$Proxy9
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81)
at java.lang.reflect.Field.set(Field.java:764)
at org.openqa.selenium.support.PageFactory.proxyFields(PageFactory.java:116)
at org.openqa.selenium.support.PageFactory.initElements(PageFactory.java:104)
at org.openqa.selenium.support.PageFactory.initElements(PageFactory.java:91)
at org.openqa.selenium.support.PageFactory.initElements(PageFactory.java:78)
at org.openqa.selenium.support.PageFactory.initElements(PageFactory.java:64)
at lenovo.tests.step.NCBLoginStep.<init>(NCBLoginStep.java:20)

您能否告诉我覆盖WebElement方法和使用我的.isDispalyed()方法的正确方法?我想继续使用@FindBy注释。

1 个答案:

答案 0 :(得分:3)

answer here描述了你想要的东西。他记录了在this blog中创建自己的PageFactory的方法 - 这是要走的路。至少我们(在工作中)正是这样做的。我们的目标是在每个WebElement方法上进行自动重试,而不是令人讨厌的StaleElementReferenceExceptions,并自动将元素滚动到视图中,如果Chrome无法自行处理它。 ; - )