从Selenium Webdriver获取搜索结果中的所有元素列表

时间:2017-12-17 22:17:13

标签: selenium

enter image description here

我正在尝试查找所有锚元素的列表,这是我在搜索结果中得到的。

当我尝试使用CSS时:

List<WebElement> anchors = driver.findElements(By.cssSelector("ul a")); 

我收到了很多结果。

当我尝试使用XPATH时:

By.xpath("/html/body/div[2]/div[1]/header/div/form/div[2]/div/div[4]/ul/a[1]

我只得到一个。

我需要所有这些。

5 个答案:

答案 0 :(得分:0)

所以你想要的是获取建议列表中的所有链接。我假设你想忽略CATEGORIES链接,只获得产品链接。

有几种方法可以解决这个问题。一种方法是找到具有ID的UL ...它是页面上唯一的(当前)。您可以使用下面的CSS选择器。这是寻找包含任何ID的任何A的直接后代的所有UL

ul[id] > a

另一种方式,也许更安全,是不依赖于UL是页面上唯一具有ID的UL这一事实。我们可以使用容器为建议下拉列表找到这些元素,然后在A中找到UL。作为建议下拉列表容器的DIV

<div class="clerk-live-search-container" id="__clerk-2-318441846" style="...">

每次ID都会改变,所以我们不能依赖它。页面上还有许多以__clerk开头的ID,因此我们也无法使用它。这个DIV确实有一个唯一的类class="clerk-live-search-container",所以我们可以使用它。我们可以从此DIV开始,然后找到包含我们想要的所有UL的{​​{1}}。 CSS选择器位于下方。

A

两个选择器都在上面工作,但我可能会使用第二个,因为我认为它不太可能在未来中断。

答案 1 :(得分:0)

看起来所有主要元素的href都以&#34; / products ...&#34;开头,如果有,请尝试使用此xpath:

By.xpath("//a[starts-with(@href, '/products')]")

答案 2 :(得分:0)

您也可以使用:

textViewA

答案 3 :(得分:0)

首先获取所有锚元素并将它们保存在WebElement列表中。然后在循环中使用getAttribute("href")找到链接地址。你可以使用如下:

List<WebElement> allAnchors = driver.findElements(By.cssSelector("div.clerk-live-search-container > div > ul > a"));
for (WebElement eachAnchorElem : allAnchors) {
    String link = eachAnchorElem.getAttribute("href");
    //System.out.println(link);
}

您可以用来保持String arraylist

中的链接地址

答案 4 :(得分:0)

让我们分析您的代码试验发生了什么:

  • 当你尝试:

    List<WebElement> anchors = driver.findElements(By.cssSelector("ul a"));
    

    您返回 133 匹配节点,因为找到<a>后跟<ul>的{​​{1}}标记已添加到List。我们实际上并不需要这样做。

  • 当你尝试:

    By.xpath("/html/body/div[2]/div[1]/header/div/form/div[2]/div/div[4]/ul/a[1]
    

    由于xpath是一个absolute xpath,其索引为[1],因此您只能获得一个元素。

解决方案:

cetaphi内输入 Search Box 文字后,您会在View Port内找到 7 搜索结果。要获取Search Results中所有锚元素的列表,您可以使用以下代码块:

    List<WebElement> anchors = driver.findElements(By.xpath("//div[@class='clerk-livesearch-title' and contains(text(),'Products')]//following::a/div[@class='clerk-live-item']//div/p"));      
    for (WebElement ele:anchors)
        System.out.println(ele.getAttribute("innerHTML"));
  

注意:某些其他divul id 属性设置为 {{1} } __clerk-1-442699327 等,它们似乎是动态的。因此必须避免这些。