如何使用xpath从网页上的特定部分获取链接?

时间:2018-02-05 14:57:36

标签: java selenium xpath selenium-webdriver

您好,非常感谢您的帮助。 :)

以下是我尝试做的事情:

我在这个模式的网页上有一些链接:

  • / HTML /体/格[4] / DIV / DIV /部分/ DIV [2] / DIV [3] / DIV /的 DIV 1 /格1 / DIV / DIV [2] / A

  • / HTML /体/格[4] / DIV / DIV /部分/ DIV [2] / DIV [3] / DIV /的 DIV 1 / DIV [2] / DIV / DIV [2] / A

  • / HTML /体/格[4] / DIV / DIV /部分/ DIV [2] / DIV [3] / DIV /的 DIV 1 / DIV [3] / DIV / DIV [2] / A

  • / HTML /体/格[4] / DIV / DIV /部分/ DIV [2] / DIV [3] / DIV /的 DIV 1 /格[4] / DIV / DIV [2] / A

但是,我在同一网页中也有其他链接,它们的路径类似但不完全遵循相同的模式:

/ HTML /体/格[4] / DIV / DIV /部分/ DIV [2] / DIV [3]的 / DIV / DIV [3] / DIV / DIV {{3} } /格1 / DIV / DIV [2] / A

如何才能获得显示第一个模式后面的链接而忽略其他模式?

Ps:我使用的是Selenium Webdriver和Java,这是关于链接的html的更新问题

 <div class="col-sm-6 half-tile">
        <div class="outside-caro">
            <div class="grey-overlay">
                <div class="inside-caro" style="background-image:url(' https://resources/images/metabolism.jpg'")>
                </div>
            </div>
            <div class="tile-content">
                <h4 class="module title-long-card">Healthy Weight Loss</h4>
                <p class="module line-clamp">This online eLearning programme is designed to help you make smart decisions when it comes to dieting and to be aware of the pitfalls.</p>
                <a class="more-button" href="/application/res-courses/overview?id=23">Learn More<i style="font-size: 10px;padding-left: 5px; "class="fa fa-chevron-right" aria-hidden="true"></i></a>
            </div>
        </div>
    </div>

1

再次感谢

3 个答案:

答案 0 :(得分:1)

我不太关注你的描述中你真正希望的内容,但我可以做一些猜测。

快速回答是, 始终提供完整路径

但是有一些方法可以让事情变得更容易编码。有几种方法可以在页面上创建指针,并且只能查找超出该点的内容。最简单的是使用简单的字符串连接:

String pointer = "/html/body/div[4]/div/div/section/div[2]/div[3]/div/div[1]";
WebElement tag1 = driver.findElement(By.xpath(pointer + "/div[1]/div/div[2]/a"));
WebElement tag2 = driver.findElement(By.xpath(pointer + "/div[2]/div/div[2]/a"));

另一种方法是将指针声明为WebElement,然后将其用作所有未来findElements的基础:

WebElement pointer = driver.findElement(By.xpath("/html/body/div[4]/div/div/section/div[2]/div[3]/div/div[1]"));
WebElement tag1 = pointer.findElement(By.xpath("./div[1]/div/div[2]/a"));
WebElement tag2 = pointer.findElement(By.xpath("./div[2]/div/div[2]/a"));

请注意xpath开头的点,说“将此节点用作起点”。

现在,我认为你真的试图完成所有锚点的列表,而不是逐个选择它们。与中一​​样,“获取匹配一个模式但不是不同但相似模式的所有链接”。为此,您可以对上述两种方法中的任何一种进行变化。例如:

WebElement pointer = driver.findElement(By.xpath("/html/body/div[4]/div/div/section/div[2]/div[3]/div/div[1]"));
List<WebElement> tags = pointer.findElement(By.xpath("./div/div/div[2]/a"));

这会将匹配模式的所有链接拉入List。有几点需要注意:

  • 第一个元素只是div,而不是div[1]div[2]。因为这似乎是模式中唯一改变的东西。
  • 最有可能的是,您用来编写脚本的语言是0索引的。因此div[1]tags.get(0)

答案 1 :(得分:0)

我有问题的解决方案,我希望它能帮到你。

您只需要为上面提到的所有4个链接标识单个父级。我觉得你可以使用这个定位器作为父节点/html/body/div[4]/div/div/section/div[2]/div[3]/div/div[1]/div[1]

请找我的代码..

    System.setProperty("webdriver.chrome.driver","Drivers/chromedriver.exe");
    WebDriver driver = new ChromeDriver();
    driver.get("http://www.abodeqa.com/2015/08/26/finding-child-elements-in-webdriver-using-findelements/");
    Thread.sleep(3000);
    WebElement parent = driver.findElement(By.xpath("//section[@class='secondary clearfix']"));
    List<WebElement>childernNodes = parent.findElements(By.xpath("./aside//a"));
    System.out.println("Total: "+childernNodes.size());
    for(WebElement value: childernNodes){
       System.out.println(value.getAttribute("href")); 
    }

答案 2 :(得分:0)

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        String input = in.nextLine();
        System.out.println(input);
        in.close();
    }
}