gpt4 book ai didi

javascript - Selenium:列出页面中的传出 URL

转载 作者:行者123 更新时间:2023-11-28 20:01:57 26 4
gpt4 key购买 nike

我需要列出某个页面中的所有传出 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com