通过查找所有锚标签,我在网页上找到了断开的链接
但是有一些通过javascript动态生成的href
当我打印所有链接的列表时,由于动态生成的链接,我得到StaleElementReferenceException
为什么我得到StaleElementReferenceException
以下的twitter链接?
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
</head>
<body>
<div style="padding-top:10px;">
<a href="https://twitter.com/url" class="twitter-follow-button" data-show-count="false" data-size="large" data-show-screen-name="false">Follow @url</a>
<script>!function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0], p = /^http:/.test(d.location) ? 'http' : 'https';
if (!d.getElementById(id)) {
js = d.createElement(s);
js.id = id;
js.src = p + '://platform.twitter.com/widgets.js';
fjs.parentNode.insertBefore(js, fjs);
}
}(document, 'script', 'twitter-wjs');</script>
</div>
</body>
Selenium代码:
List<WebElement> links=driver.findElements(By.tagName("a")); for(WebElement link: links) { System.out.println(link.getAttribute("href")); }
答案 0 :(得分:0)
几乎可以肯定发生了什么:
get(<url>)
被调用,页面开始加载findElements(By.tagName("a"))
被调用。这会将事件发送到浏览器,浏览器会开始构建匹配列表并将其返回给WebDriver
来电。<script>
标记,并向platform.twitter.com/widgets.js
发出请求,该请求开始生成新的/修改现有<a>
元素。简而言之,因为你的WebElement
可能来自两个不同的状态(在加载之前,加载之后),并且因为“之前”的一些不再与“之后”相同,所以“之前”元素被确定为陈旧。
你可以做很多事情:
findElements(By.tagName("a"))
直到您知道Twitter小部件已完成加载,即等待其中一个生成的链接存在。StaleElementReferenceException
,并在您的异常处理程序中重做 findElements
查找。(2)可能更简单。如果您只有20%的时间获得异常并且查找速度很快,则性能不会受到太大影响。