我有以下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() - 它可以运行的方法。我现在不知道该怎么办。谢谢你的帮助。
答案 0 :(得分:1)
刷新可以通过页面上的javascript代码触发。 它为一些仅限IE的页面内容留出了空间,这让你感到不安。
我会重新安排代码,以尽快提取元素的属性作为临时或甚至永久解决方案。似乎你已经知道如何做到这一点。
UPD:
如果您无法考虑帮助,请使用第三方库来提取实际属性值,并仅使用selenium进行点击和浏览。
以下是在python中使用selenium
和lxml
的示例:
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']
将整页源代码放入变量后 - 站点脚本不会改变它,您将有无限的时间来玩它。