首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >InternetExplorerDriver StaleElementReferenceException

InternetExplorerDriver StaleElementReferenceException
EN

Stack Overflow用户
提问于 2012-01-25 12:37:24
回答 1查看 1K关注 0票数 1

我有以下Selenium测试代码:

代码语言:javascript
复制
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,它就能正常工作。但是,如果我在Internet中运行它,它有时会在它想要获得属性"class“的行崩溃。出现了一个StaleElementReferenceException。有趣的是,这个异常只出现在Windows7 IE9上,而不是Windows IE8上。我在谷歌上搜索了很多如何解决这个问题的方法,但是没有一个解决方案对我有帮助。如果元素已经刷新或其他什么内容,则会出现此异常,但在waitForElementList()-methods之间,getAttribute调用并不是刷新。如果我只运行第一个waitForElementList()-method (用于elementA),而不运行其他waitForElementList()-methods,它就能工作。我现在不知道该怎么办了。谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2012-01-26 06:37:19

刷新可以由页面上的javascript代码触发。它为一些IE专用的页面内容留下了空间,这给你带来了麻烦。

我会重新安排代码,以尽快提取元素的属性,作为临时甚至永久的解决方案。看来你已经知道该怎么做了。

UPD:

如果没有任何帮助,可以使用第三方库提取实际属性值,使用selenium只用于单击和浏览。

下面是在python中同时使用seleniumlxml的示例:

代码语言:javascript
复制
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']

一旦你把整个页面的源代码放到可变站点脚本中,脚本就不会改变它,你将有无限的时间去玩它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9002848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档