问题描述
我在一个网页上有多个链接。单击链接后,将弹出一个弹出窗口,我在弹出窗口中的字段上设置了一些值,然后单击“保存”。
单击“保存”后,主网页将刷新以显示链接的更新状态。我使用“ 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 (将#修改为@)