0

这就是我的代码的样子

    public void someTest() {
      String x = "/html/body/div/div["
      String y = "]/a"
         for (int i = 1; i < 5; i++){
            String links = x + i + y;
            driver.findElement(By.xpath(links)).click(); // This will iteratively go to the next link and click on it
         }
    }

然而,我想要实现的是,一旦它点击链接,它就应该寻找后代链接并点击这些链接。那么有没有办法做到这一点?如果我尝试以下类似的方法,那会奏效吗?

    driver.findElement(By.xpath(links/descendant::a).click(); 
4

4 回答 4

1

这是一种脆弱的编码方式,在循环过程中会改变 xpath。相反,我建议使用 findElements 方法并遍历它返回的元素,如下所示:

public void someTest() {
 xpath xpath_findlinks = "/html/body/div/div/a";
 xpath relative_xpath = "./..//a";
 for (WebElement eachlink : driver.findElements(By.xpath(xpath_findlinks))) {
  eachlink.click();
  for (WebElement descendantlink : eachlink.FindElements(By.xpath(relative_xpath))) {
   descendantlink.click();
  }
 }
}

注意一个关键的区别。你第一次调用findElements它是在driver上,所以它会浏览整个 html;但是第二次,它被称为特定元素(当前链接)的方法,因此您可以使用它来查找与该链接相关的元素- 例如查找后代。

我推荐使用这种结构;但是,在不了解您的整体 html 的情况下,很难知道要使用什么相对 xpath。我提供的只是相对 xpath 的一个示例,它具有独特的./.

于 2013-08-06T16:15:00.660 回答
0

尝试这个

  String x = "/html/body/div/div[";
  String y = "]//a"; // notice the double "//"

XPath 中的//应该整理 type 的所有后代a

于 2013-07-17T20:15:45.783 回答
0

以下代码使用 Ruby。您可以使用 Java 应用相同的逻辑:

# get element of first div
element = driver.find_element(:xpath, "/html/body/div") 

# collect all links elements in 'links' 
links = element.find_elements(:xpath, ".//div/a") variable

# iterate over links and click on each link
links.each do |link|
  link.click
end
于 2013-07-18T17:17:47.633 回答
0

You might need logic something like below

//For clicking on descendants of type a under links

 driver.findElement(By.xpath(links)).findElement(By.xpath("//a")).click();
于 2013-07-18T04:47:30.257 回答