InternetExplorerDriver StaleElementReferenceException

时间:2012-01-25 12:37:24

标签: selenium webdriver

我有以下Selenium测试代码:

waitForElementList(driver, timeout, By.xpath(elementA);
waitForElementList(driver, timeout, By.xpath(elementB);
waitForElementList(driver, timeout, By.xpath(elementC);
waitForElementList(driver, timeout, By.xpath(elementD);
waitForElementList(driver, timeout, By.xpath(elementE);
waitForElementList(driver, timeout, By.xpath(elementF);

List<WebElement> elementA = driver.findElements(By.xpath(elementA));
List<WebElement> elementB = driver.findElements(By.xpath(elementB));
List<WebElement> elementC = driver.findElements(By.xpath(elementC));
List<WebElement> elementD = driver.findElements(By.xpath(elementD));
List<WebElement> elementE = driver.findElements(By.xpath(elementE));
List<WebElement> elementF = driver.findElements(By.xpath(elementF));

for(int i = 0; i < elementA.size(); i++){
    int id = Integer.valueOf(elementA.get(i).getAttribute("class"));
    //doing things with the other elements
}

public static void waitForElementList(WebDriver driver, int timeout, final By locator){
    FluentWait<WebDriver> wait = new FluentWait<WebDriver>(driver)
       .withTimeout(timeout, TimeUnit.SECONDS)
       .pollingEvery(1, TimeUnit.SECONDS)
       .ignoring(NoSuchElementException.class)
       .ignoring(StaleElementReferenceException.class);

    wait.until(new Function<WebDriver, List<WebElement>>() {
        public List<WebElement> apply(WebDriver driver) {
            return driver.findElements(locator);
        }
    });
}

如果我在任何浏览器中运行这段代码而不是Internet Explorer它可以正常工作。但是,如果我在Internet Explorer中运行它,它有时会在它想要获取属性“类”的行崩溃。出现StaleElementReferenceException。有趣的是这个例外只出现在Windows 7 IE9上,但不出现在Windows XP IE8上。 我搜索了很多如何解决这个问题,但没有任何解决方案帮助我。如果元素已刷新或在waitForElementList() - 方法之间但getAttribute调用未刷新,则会出现此异常。如果我只运行第一个waitForElementList() - 方法(对于elementA)而不运行其他waitForElementList() - 它可以运行的方法。我现在不知道该怎么办。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

刷新可以通过页面上的javascript代码触发。 它为一些仅限IE的页面内容留出了空间,这让你感到不安。

我会重新安排代码,以尽快提取元素的属性作为临时或甚至永久解决方案。似乎你已经知道如何做到这一点。


UPD:

如果您无法考虑帮助,请使用第三方库来提取实际属性值,并仅使用selenium进行点击和浏览。

以下是在python中使用seleniumlxml的示例:

from lxml import etree
from selenium.webdriver import Firefox  # IE, or Chrome


SEARCH_EDITBOX_CSS_CLASS_XPATH = '//input[@id="lst-ib"]/@class'

browser = Firefox()
browser.get('http://google.com')
html = browser.page_source

tree = etree.fromstring(html, parser=etree.HTMLParser())
css_classes = tree.xpath(SEARCH_EDITBOX_CSS_CLASS_XPATH)

print css_classes
# prints out list of 'class' attributes for each of elements found:
# ['gsfi']

将整页源代码放入变量后 - 站点脚本不会改变它,您将有无限的时间来玩它。