如何解决刷新页面后需要逻辑以避免“ StaleElementReferenceException”
我在一个网页上有多个链接。单击链接后,将弹出一个弹出窗口,我在弹出窗口中的字段上设置了一些值,然后单击“保存”。
单击“保存”后,主网页将刷新以显示链接的更新状态。我使用“ for”循环逐个迭代所有链接并更新状态。为了避免引用过时的元素,我编写了一个实用程序来检查元素是否仍然过时,但是我无法摆脱此异常。
以下是我的实用代码:
public static boolean isStale(WebElement e){
try{
e.isDisplayed();
return false;
}catch(StaleElementReferenceException ex){
return true;
}
}
下面是我的页面对象代码:
public class DocCheckPageObjects {
WebDriver driver = null;
public DocCheckPageObjects(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(driver,this);
}
@FindBy(tagName="a")
WebElement tagName_a;
public WebElement tagName_a() { return tagName_a; }
@FindBy(xpath="//input[@name='progress']")
WebElement listBoxDocStatus;
public WebElement listBoxDocStatus() { return listBoxDocStatus; }
@FindBy(xpath="//span[@title='Received Hard Copy']")
WebElement listBoxDocStatusOptionReceivedHardCopy;
public WebElement listBoxDocStatusOptionReceivedHardCopy() { return listBoxDocStatusOptionReceivedHardCopy; }
@FindBy(xpath="//button[@name='update']")
WebElement btnSave;
public WebElement btnSave() { return btnSave; }
@FindBy(xpath="//*[contains(text(),'Saved Successfully')]")
WebElement toastMsg;
public WebElement toastMsg() { return toastMsg; }}
以下是我的班级代码:
DocCheckPageObjects docCheckObj = new DocCheckPageObjects(driver);
WebElement docCheckTable = driver.findElement(By.xpath("//div[@class='slds-gutters slds-wrap slds-m-horizontal_xx-small']/table"));
System.out.println("No of Links: " + docCheckTable.findElements(By.tagName("a")).size());
int linkCount = docCheckTable.findElements(By.tagName("a")).size();
for(int i=0; i<linkCount;i++) {
wait.until(ExpectedConditions.elementToBeClickable(docCheckTable.findElements(By.tagName("a")).get(i)));
docCheckTable.findElements(By.tagName("a")).get(i).click();
docCheckObj.listBoxDocStatus().click();
docCheckObj.listBoxDocStatusOptionReceivedHardCopy().click();
docCheckObj.btnSave().click();
while(util.isStale(docCheckTable.findElements(By.tagName("a")).get(i))) {
docCheckTable = driver.findElement(By.xpath("//div[@class='slds-gutters slds-wrap slds-m-horizontal_xx-small']/table"));
}
}
我认为while循环内的代码是在刷新页面之前执行的,因此我仍然收到Stale元素异常。
下面是使用thread.sleep的代码:
for(int i=0; i<linkCount;i++) {
Thread.sleep(1000);
docCheckTable = driver.findElement(By.xpath("//div[@class='slds-gutters slds-wrap slds-m-horizontal_xx-small']/table"));
wait.until(ExpectedConditions.elementToBeClickable(docCheckTable.findElements(By.tagName("a")).get(i)));
docCheckTable.findElements(By.tagName("a")).get(i).click();
docCheckObj.listBoxDocStatus().click();
docCheckObj.listBoxDocStatusOptionReceivedHardCopy().click();
docCheckObj.btnSave().click();
}
Q1)上面的代码解析了状态元素引用,但我想避免使用thread.sleep。
Q2)我必须将定位符(如“ docCheckTable”)放在可执行类中,而不是在Page Object工厂类中。如何将我所有的定位器放在Page Object类中,该类返回Webelements的列表并避免Stale Element异常。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。