Java Selenium-PageObjectFactory-在重新加载后在同一页上引用元素

Java Selenium-PageObjectFactory-在重新加载后在同一页上引用元素,java,selenium-webdriver,webdriver,Java,Selenium Webdriver,Webdriver,我正在使用Webdriver和Java测试一个网页 测试页面包含记录列表,我点击“Employee ID”标题超链接,记录应该按照员工ID的升序排序,“Employee ID”列旁边应该有一个小图标,指示结果现在已排序 以下是我的代码: public Class ResultsPage extends SlowLoadableComponent<ResultsPage> { @FindAll({ @FindBy(how = How.XPATH, using = "some

我正在使用Webdriver和Java测试一个网页

测试页面包含记录列表,我点击“Employee ID”标题超链接,记录应该按照员工ID的升序排序,“Employee ID”列旁边应该有一个小图标,指示结果现在已排序

以下是我的代码:

public Class ResultsPage extends SlowLoadableComponent<ResultsPage> {

    @FindAll({ @FindBy(how = How.XPATH, using = "some xpath"), @FindBy(how = How.XPATH, using = "another xpath") })
    public List<WebElement> resultsTableElement;

    @FindBy(how = How.XPATH, using = "//a[@title='A system assigned identifier for the Employee record.']")
    public WebElement employeeIDColumnTitle;

    @FindBy(how = How.XPATH, using = "//a[@title='A system assigned identifier for the Employee record.']/following-sibling::img")
    public WebElement ascOrDescIcon;

    public ResultsPage(WebDriver driver) {
        super(new SystemClock(),20);
        this.driver = driver;
        wait = new WebDriverWait(driver, Start.TIME_OUT);
        PageFactory.initElements(driver,this);
    }

    @Override
    protected void load() {
        PageFactory.initElements(driver, this);
        LOGGER.info("From the load method");
    }

    @Override
    protected void isLoaded() throws Error {
        boolean loaded = false;
        if (resultsTableElement.size() > 0) {
            loaded = true;
        }
        LOGGER.warn("isloaded method failed ");
        Assert.assertTrue(loaded, "Looks like the Claim Results Search Frame is not loaded yet");
    }

    public void testThis() {
        //some code here
        systemIDColumnTitle.click();
        PageFactory.initElements(driver, this); //Calling the initElements of the same page again to see that the element 
        LOGGER.info(ascOrDescIcon.getAttribute("src")); //This line always fails saying that the element is not found.
    }

}
公共类结果页扩展了SlowLoadableComponent{
@FindAll({@FindBy(how=how.XPATH,using=“some XPATH”),@FindBy(how=how.XPATH,using=“另一个XPATH”)})
公共列表结果表元素;
@FindBy(how=how.XPATH,使用=“//a[@title='a系统为员工记录分配的标识符'.]]”)
公共网站元素employeeIDColumnTitle;
@FindBy(how=how.XPATH,使用=“//a[@title='a系统为员工记录分配的标识符”。]/以下同级::img”)
公共网络元素Ascordscicon;
公共结果页(WebDriver驱动程序){
超级(新系统时钟(),20);
this.driver=driver;
等待=新的WebDriverWait(驱动程序,启动。超时);
PageFactory.initElements(驱动程序,this);
}
@凌驾
受保护的空荷载(){
PageFactory.initElements(驱动程序,this);
LOGGER.info(“来自加载方法”);
}
@凌驾
受保护的void isLoaded()引发错误{
布尔加载=假;
如果(resultsTableElement.size()>0){
加载=真;
}
LOGGER.warn(“isloaded方法失败”);
Assert.assertTrue(已加载,“看起来索赔结果搜索框架尚未加载”);
}
public void testThis(){
//这里有一些代码
systemIDColumnTitle。单击();
PageFactory.initElements(driver,this);//再次调用同一页的initElements以查看元素
LOGGER.info(ascOrDescIcon.getAttribute(“src”);//这一行总是说找不到元素而失败。
}
}

根据您指定的注释,为什么不能在同一页面对象中定义定位器,如:

@FindBy(id="newElement")
private WebElement newElement
newElement
指向在特定操作后创建的新元素

编辑: 根据您的评论,您可以直接调用get方法,而不是另一次实例化。请理解,所有
@FindBy
网站元素
均为代理;只有在对其调用方法时,才会获取它们(使用您提供的定位器)并执行特定操作


所以这就是原因,你可以在你的页面对象上有元素,调用
initElements
不会抛出错误,即使
@FindBy
也找不到

你到底想做什么?我有一个页面,当我单击“排序结果”链接时,该页面将刷新并在同一页面上创建新元素。那么我如何访问该新元素呢。。如果问题仍然不清楚,请告诉我。但是当创建页面时,该元素在页面上不存在,并且仅当我单击特定链接时才创建。我在单击链接后调用
PageFactory.InitElements
,以便新元素被初始化并指向webelement。。我的问题是我应该调用
PageFactory.initElements
还是
this.get()