使用Selenium网络驱动程序在网页上查找断开的链接,避免动态生成链接
find broken links on webpage using selenium webdriver by avoiding dynamically generated links
我通过查找所有锚标签在网页上找到断开的链接。
但是有一些通过javascript动态生成的href。
当我打印所有链接的列表时,由于动态生成的链接,我得到了StaleElementReferenceException
。
为什么我会为下面的推特链接StaleElementReferenceException
?
<!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>
硒代码 :
List<WebElement> links=driver.findElements(By.tagName("a")); for(WebElement link: links) { System.out.println(link.getAttribute("href")); }
几乎可以肯定的是,正在发生的事情是:
- 调用
get(<url>)
,页面开始加载 -
findElements(By.tagName("a"))
被称为。这会将事件发送到浏览器,浏览器开始构建匹配项列表并将其返回给调用方WebDriver
。 - 同时,已插入
<script>
标签,并请求platform.twitter.com/widgets.js
,开始生成新的/修改现有的<a>
元素。
简而言之,由于您的WebElement
可能来自两种不同的状态(加载前、加载后(,并且由于"之前"中的某些元素不再与"之后"中的相同匹配,因此"之前"元素被确定为过时。
您可以执行许多操作:
- 延迟您的
findElements(By.tagName("a"))
,直到您知道Twitter小部件已完成加载,即等待其中一个生成的链接的存在。 - 如果发生
StaleElementReferenceException
,请捕获它,并在异常处理程序中重做findElements
查找。
(2(可能更简单。如果只有 20% 的时间出现异常,并且查找速度很快,则性能不会受到很大影响。
相关文章:
- 动态地改变“”的URL;添加新项目”;链接使用javascript/jquery
- 根据选项卡内部的文本链接中的哈希ID动态选择jqueryUI选项卡
- Facebook共享动态参数链接
- JavaScript-取决于多个下拉选择或复选框的动态链接
- 当用户点击动态创建的链接时,如何调用JS方法.JQuery,ASP.NET MVC
- 我想将链接关联到动态创建的p元素上的相应文章
- 动态虚拟目录和外部 JavaScript 链接
- Angular 2中登录页上的动态后退链接
- Javascript+动态菜单+当前链接样式(CSS)+基于PHP的网站
- 使用路由器链接动态添加元素
- 我希望所有页面都有相同的固定标题-我可以链接动态HTML或Javascript吗
- Angular's深度链接-动态链接与静态链接
- 同时创建和链接动态元素
- 如何根据单击链接动态填充部分
- 链接动态加载的javascript
- javascript为所有链接动态添加相对路径
- 通过链接动态创建img,而不附加多个实例
- 动态添加了li's,现在通过超链接动态删除它们
- ReactRouter链接动态参数不工作
- 引导模式替换按钮链接-动态Div id