刷新页面后需要逻辑以避免“ StaleElementReferenceException”

问题描述

我在一个网页上有多个链接。单击链接后,将弹出一个弹出窗口,我在弹出窗口中的字段上设置了一些值,然后单击“保存”。

Web Main Page

Popup

单击“保存”后,主网页将刷新以显示链接的更新状态。我使用“ 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...