- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要列出某个页面中的所有传出 URL。
为了简单起见,我们假设只有 <a>
元素可以产生链接。
对于某些元素,URL 位于 href
中属性,而对于其他属性,URL 在用户单击它们时由 javascript 生成。
我的解决方案是找到所有<a>
页面中的元素,然后一一单击它们。当我单击传出链接时,浏览器会导航到该链接。为了继续点击其余链接,我导航回原始页面。但是,当我导航回原始页面时,我得到: org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document
.
我的代码:
System.setProperty("webdriver.chrome.driver", "drivers/chromedriver.exe")
val driver = new ChromeDriver()
val byHref = By.tagName("a")
// Get all <a> elements
val links = driver.findElements(byHref)
// Resolve all <a> to URLs
val resolvedLinks = links.map(resolveLink(_))
// Resolve <a> to URL
def resolveLink(link: WebElement) : String = {
// Get href attribute
val href = link.getAttribute("href")
// href is javascript?
if (href == null || href.startsWith("javascript:")) {
// Click link
link.click()
// Get the URL we navigated to
val navigatedUrl = driver.getCurrentUrl
// Navigate back to our original page
driver.navigate().back()
navigatedUrl
}
else
href
}
我的问题是:有没有办法列出页面中的所有传出 URL,同时保留页面的原始上下文?
最佳答案
一旦您导航到另一个网页,甚至切换到同一网页中的 iframe
,内存中的任何 WebElement
对象都会被删除。可能“过时”。
一个可选的解决方案是列出所有元素 ID,然后迭代该列表。
我不清楚您使用的是什么语言,但以下是如何在 Java 中做到这一点:
Set<String> linkIds = new HashSet<String>();
List<WebElement> links = driver.findElements(By.tagName("a"));
for (WebElement link : links)
{
linkIds.add(link.getAttribute("id"));
}
for (String linkId : linkIds)
{
WebElement link = driver.findElement(By.id(linkId));
link.click();
// Add the rest of your code here...
}
但请注意,上述所有内容均假设每个链接都有唯一的 ID,并且当您导航回网页时,所有链接都保留在网页中。如果您正在访问的特定网页不是这种情况,则需要采用替代方法。
您可以迭代链接索引,而不是迭代链接 ID,假设当您导航进出网页时链接保持相同的顺序。但这效率较低,因为您必须在每次迭代开始时检索所有链接的完整列表。
for (int i=0; true; i++)
{
List<WebElement> links = driver.findElements(By.tagName("a"));
if (i >= links.size())
break;
links.get(i).click();
// Add the rest of your code here...
}
当您导航回网页时,即使链接没有保持相同的顺序,上面的代码也应该可以工作。然而,在这种情况下,您很可能会错过其中一些。
关于javascript - Selenium:列出页面中的传出 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21511190/
我想创建一个 Mercurial Hook ,当我推送到本地存储库时,它会推送到备份远程存储库。我以为我可以钩住“传出”钩子(Hook),但这会创建一个不漂亮的无限循环。那么是否有类似推送后的 Hoo
我有一个托管在 Tomcat 上的应用程序,它需要通过 IBM DataPower 设备对托管的服务进行 HTTPS 调用。我在日志中看到以下内容: http-bio-8080-exec-1, REA
是否有一个 hg 命令可以组合 hg传入 + hg传出 + hg status? 这会告诉您是否有任何远程内容需要传入,是否有任何本地提交的内容需要出去,或者是否有任何本地更改需要提交。 最佳答案 虽
我在 Azure 中有一个 Windows VM,用于 VS2015 实验。 Google 云端硬盘无法联系更新服务器来完成其自身的安装(尽管 Chrome/Omaha 工作正常)。 显然,我也无法通
我正在使用 QuickFIX/J (1.6.4)。我可以看到所有消息都非常正确地隔离(传入/传出/事件) , event> (Session FIX.4.2:CLIENT2/SUB-> sched
我在 Azure 中有一个 Windows VM,用于 VS2015 实验。 Google 云端硬盘无法联系更新服务器来完成其自身的安装(尽管 Chrome/Omaha 工作正常)。 显然,我也无法通
我正在使用 QuickFIX/J (1.6.4)。我可以看到所有消息都非常正确地隔离(传入/传出/事件) , event> (Session FIX.4.2:CLIENT2/SUB-> sched
我正在使用 docker-compose 运行我的应用程序。该应用程序包含许多容器。一个容器有一个 node.js 应用程序,另一个容器有一个 .net 核心应用程序。当尝试从任何容器向外部服务器发送
我想将文件从 HDFS 传输到不在 hadoop 集群中但在网络中的不同服务器的本地文件系统。 我本可以做到: hadoop fs -copyToLocal and then scp/ftp .
我遇到了一个奇怪的偶然事件,我的结果 lsof | grep 40006 制作 java 29722 appsrv 54u IPv6 71135755
我错误地 checkin 了一些更改。现在更改正在传出更改中,但我不希望它们交付。我怎样才能让它们回到 Unresolved 状态?如果我丢弃它们,它们就会从我的源代码中消失,我就会失去我的工作。 最
我在将 URL 参数添加到每个生成的 URL 或重定向到 ASP MVC 4 应用程序时遇到问题。 我想生成一个 ID,并在整个应用程序的任何时候使用这个 ID。在 session 中存储 id 不是
我正在开发一个 Java/Spring Web 应用程序,它对每个传入请求执行以下操作: 向第三方网络服务器发出大量请求, 检索每个人的响应, 将每个响应解析为 JSON 对象列表, 将 JSON 对
我有一个基本的“包装器”WinForms 应用程序,它有一些基本控件和一个 WebBrowser 控件 (System.Windows.Forms.WebBrowser)。这链接到一个网络服务,它完成
这个问题在这里已经有了答案: Can I send webrequest from specified ip address with .NET Framework? (3 个答案) 关闭 8 年前
我在这项研究中对交通路口进行研究,我试图找到有影响力的节点,也就是说......哪些路口会相互影响,我试图将我的网络表示为图形网络,所以我搜索了已经使用的算法在希望将同样的方法应用于我的问题的网络中,
我正在开发 OpenCL 1.2 处理大型图像的应用程序。 目前,我正在测试的图像是 16507x21244 像素。我的 内核在一个循环中运行,该循环对图像的 block 进行操作.内核将 32bpp
我知道有关断开链接的问题一直被问到,但我的问题似乎有点不同,而且没有一个解决方案有效。 现在,点击我的导航部分中的其他网站链接时,它们都不起作用。它记录它们在那里,如果您右键单击它并选择“在新选项卡中
我正在使用 node.js 构建数据传输代理服务器。它使用 http(s) REST API 将客户端请求通过管道传输到快速对象存储服务器。 It works fine for the individ
我有一个 Azure Servicebus 函数触发器,每当事件放入其指定队列时,该触发器就会调用外部端点。但是,当函数拾取事件并准备发出传出请求时,它会失败并显示以下日志消息 Executed 'A
我是一名优秀的程序员,十分优秀!