使用Selenium网络驱动程序在网页上查找断开的链接,避免动态生成链接

find broken links on webpage using selenium webdriver by avoiding dynamically generated links

本文关键字:链接 动态 断开 驱动程序 网络 Selenium 网页 查找 使用      更新时间:2023-09-26

我通过查找所有锚标签在网页上找到断开的链接。
但是有一些通过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"));   }

几乎可以肯定的是,正在发生的事情是:

  1. 调用get(<url>),页面开始加载
  2. findElements(By.tagName("a"))被称为。这会将事件发送到浏览器,浏览器开始构建匹配项列表并将其返回给调用方WebDriver
  3. 同时,已插入<script>标签,并请求platform.twitter.com/widgets.js,开始生成新的/修改现有的<a>元素。

简而言之,由于您的WebElement可能来自两种不同的状态(加载前、加载后(,并且由于"之前"中的某些元素不再与"之后"中的相同匹配,因此"之前"元素被确定为过时。

您可以执行许多操作:

  1. 延迟您的findElements(By.tagName("a")),直到您知道Twitter小部件已完成加载,即等待其中一个生成的链接的存在。
  2. 如果发生StaleElementReferenceException,请捕获它,并在异常处理程序中重做findElements查找。

(2(可能更简单。如果只有 20% 的时间出现异常,并且查找速度很快,则性能不会受到很大影响。