0

我有一个 webElements 列表,我需要遍历并单击每个元素,但是因为每次单击都会刷新页面,所以我得到一个 StaleElementReferenceException。每个元素如下所示:

<img src="images/english/edit.gif" border="0" height="24" width="47">

因此,我使用递归方法单击每个 webElement,然后将索引传递给下一个实例并刷新列表:


public int enterDescription(int place) { 列表描述 = driver.findElements(By.cssSelector(img[src='images/english/edit.gif']));

for (int index = 0; index < descriptions.size(); index++) { index = place; if(place==descriptions.size()) { return place; } else { descriptions.get(index).click(); enterDescription(place++); } } return place; }

这最初一直有效,直到方法崩溃时的完成条件,达到结束条件后,我需要立即终止所有实例。有任何想法吗?

4

2 回答 2

0

你真的不需要递归来做到这一点。您只需要在每次通过 for 语句开始时刷新您的描述。像这样的东西:

    public void enterDescription() {
        int numberOfImages = driver.findElements(By.cssSelector(img[src='images/english/edit.gif'])).size();

    for (int index = 0; index < numberOfImages; index++) {
        List<WebElement> descriptions = driver.findElements(By.cssSelector(img[src='images/english/edit.gif']));
        descriptions.get(index).click();
        // Test something
        // Do something to return to initial page
        }
    } 
于 2013-04-19T23:13:55.353 回答
0

忽略递归的东西,你实现了用这个结构终止的愿望

public interface Terminatable {
    void terminate();
}

public class Terminator {
    private LinkedList<Terminatable> terminatables = new LinkedList<Terminatable>();

    public void register(Terminatable terminatable) {
        terminatables.offer(terminatable);
    }

    public void unregister(Terminatable terminatable) {
        terminatables.remove(terminatable);
    }

    public void terminate() {
        Terminatable terminatable = terminatables.poll();

        while(terminatable != null) {
            terminatable.terminate();
            terminatable = terminatables.poll();
        }
    }
}

public class Worker implements terminatable {
    private Terminator terminator;

    public Worker(Terminator terminator) {
        this.terminator = terminator;
        terminator.register(this);
    }

    public void terminate() {
        // do your termination stuff here
    }

    [...]

    public void work() {
        // do your work and start termination when you are finished
        terminator.terminate();
    }
}

如果您不再需要他们,请记住取消注册您的工人!

于 2013-04-19T10:40:23.560 回答