Java Selenium-PageObjectFactory-在重新加载后在同一页上引用元素
我正在使用Webdriver和Java测试一个网页 测试页面包含记录列表,我点击“Employee ID”标题超链接,记录应该按照员工ID的升序排序,“Employee ID”列旁边应该有一个小图标,指示结果现在已排序 以下是我的代码: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
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()