【问题标题】:Get link text Selenium java获取链接文本 Selenium java
【发布时间】:2016-06-12 06:16:48
【问题描述】:

我在获取链接文本时遇到问题。

在网站上我有文字链接 <a href="DetailsZZ-10048.html">ZZ-10048</a>,与 ZZ- 的一部分是静态的,数字会增加,我之前并不知道。我需要得到这个号码。

我曾经查看过:Get link text - Selenium, Java,但那里有所有链接、URL(不是链接的文本)

我也尝试过:How to gettext() of an element in Selenium Webdriver,但每次我更改并寻找解决方案时都会输出Printing null

而解决方案:Java Selenium, how to get linkText (anchor) from link WebElement 也不好,因为它不识别"a[href*='ZZ-']"

所以,最接近的是:

List<WebElement> elements = driver.findElements(By.tagName("a")); 
for (int i = 0; i < elements.size(); i++) {
   System.out.println(elements.get(i).getAttribute("href"));
}

但我怎样才能更改为不仅查看 URL,还查看链接名称? (尤其是从ZZ-开始的那个)

【问题讨论】:

  • 您可以尝试查找链接的文本By.xpath//a[contains(href, "DetailsZZ-")]

标签: java html selenium


【解决方案1】:

您好,您可以使用以下代码提取号码:

public String splitfunc(String str)
{
    str = str.replace(".html", "");
    String[] array = str.split("-"); 
    return array[1];
}


  List<WebElement> elements = driver.findElements(By.tagName("a")); 
  for (int i = 0; i < elements.size(); i++) {
   System.out.println(splitfunc(elements.get(i).getAttribute("href")));
}

【讨论】:

  • 效果几乎很好,我想我知道你想展示什么 :) 我刚刚收到 "java.lang.ArrayIndexOutOfBoundsException: 1" 错误返回,所以我只需要找出发生了什么(但感谢棒: ) )
  • @Michal :我猜有一些a 元素在其href 属性中没有数值;类似于:“DetailsZZ”或“DetailsZZ-”或“”,这就是它抛出 ArrayOutOfBoundsException 的原因,因为数组中没有要显示的第二个值。正如 @Andersson 所评论的那样,尝试使用上面的代码,将其替换为 List&lt;WebElement&gt; elements = driver.findElements(By.xpath("//a[contains(@href, "DetailsZZ-")]")); List&lt;WebElement&gt; elements = driver.findElements(By.xpath("//a[starts-with(href, "DetailsZZ-")]"));
  • 你们太棒了,这就是它应该做的! :D 谢谢!但是将来如果有人会看这里,应该是'DetailsZZ-' 而不是"DetailsZZ-" :)
  • @Michael....这对我来说听起来是一个数组问题,即 Array[1]...当数组的值不存在并且我们试图获取它时可能会发生这种情况..
【解决方案2】:

要定位你可以使用的元素

List<WebElement> elements = driver.findElements(By.partialLinkText("ZZ"));
// or
List<WebElement> elements = driver.findElements(By.cssSelector("[href*='ZZ']"));

要获取你可以做的href和文本

for (WebElement element : elements) {
    String href = element.getAttribute("href");
    String text = element.getText();
    // or
    String text = element.getAttribute("innerText");

    // and to get the number
    String[] data = text.split("-");
    String number = data[1];
}

【讨论】:

  • 它工作得几乎很好,我只是在 String[] data = text.split("-"); 行上得到 NullPointerException,所以我正在努力找出发生了什么:)
  • @Michal 两个版本的文本提取?
【解决方案3】:

由于您正在寻找链接的文本而不是实际的 href URL 本身,我认为抓取元素文本并将其用于解析而不是提取 href 属性更简洁且不易出错。那么,如果文本alwaysZZ-someNumber的形式,那么你可以让解析变得相当简单。

使用 Java 8 的示例(假设已创建驱动程序并加载了正确的页面):

String leadingStr = "ZZ-";
List< Integer > numbers = driver.findElements(By.tagName("a"))
                                .stream()
                                .map(WebElement::getText)
                                .filter(str -> null != str && str.startsWith(leadingStr))
                                .map(str -> str.replace(leadingStr,"").trim())
                                .filter(str -> !str.isEmpty())
                                .map(Integer::valueOf)
                                .collect(Collectors.toList());

没有流的例子:

String leadingStr = "ZZ-";
List< Integer > numbers = new ArrayList<>();
for (WebElement elem : driver.findElements(By.tagName("a"))) {
    String text = elem.getText();
    if (text.startsWith(leadingStr)) {
        numbers.add(Integer.valueOf(text.replace(leadingStr,"").trim()));
    }
}

当然,如果假设它们始终采用ZZ-someNumber 的形式是无效的,那么以上两者都需要更多的错误处理,但它只是在整数周围简单地添加一些 try catch 块转换等。

【讨论】:

    【解决方案4】:

    如果您的语言水平允许,一个更优雅的方法是使用 foreach 来避免索引超出范围异常的风险。

    这将允许您根据请求获取链接的文本,而不是 href 并进行大量解析。

    修剪只是额外的防御性编码。

    List<WebElement> links = driver.findElements(By.tagName("a")); 
    for (WebElement link : links ) {
       System.out.println(link.getText().replace("ZZ-","").trim());
    }
    

    【讨论】:

      【解决方案5】:
      WebElement element = driver.findElement(By.partialLinkText("ZZ-10048"));
      String txt = element.getText();
      String[] words = txt.split("-");
      System.out.println(words[1]);
      

      【讨论】:

      • 我不确定,但是 element.element.getText() 不应该编译,因为 element 不是 WebElement 中的公共字段。
      【解决方案6】:

      我认为这是从锚点获取文本的最简单方法之一。

      WebElement link  = driver.findElement(By.partialLinkText("ZZ"));
      System.out.println(link.getText());
      

      【讨论】:

        【解决方案7】:

        这个问题的确切解决方案是这样的:

        正如您所提到的,您希望在 - 之后获得 数字

        为此,您可以使用 xpath 中提供的 start-with 来匹配开始文本。

         List<WebElement> elements = driver.findElements(By.xpath("//a[starts-with(text(),'ZZ-')]")); 
          for (int i = 0; i < elements.size(); i++) {
           System.out.println(elements.get(i).getAttribute("href")));  
        

        @Gupta 的答案虽然很好。 IMO,这不是关于硒的正确解决方案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-18
          • 2023-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多