【问题标题】:How to get all "li" elements of "ul" class in Selenium WebDriver如何在 Selenium WebDriver 中获取“ul”类的所有“li”元素
【发布时间】:2015-12-06 12:16:38
【问题描述】:

我是 Selenium 网络驱动程序的新手。我遇到了一个要求,我必须运行我的测试,该测试点击一个部分中的所有链接。有人可以帮我编写 Java 代码吗?附上一张图片,显示该特定部分的萤火虫属性。 我已经尝试了下面的代码,但它返回了一个空列表。

public static void main(String[] args) {

    WebDriver driver = new FirefoxDriver();

    driver.get("https://dev.www.tycois.com/");
    driver.manage().window().maximize();

    List<WebElement> allElements = driver.findElements(By.xpath("html/body/div[10]/div/div[1]/div[3]/ul[1]/li[5]"));
    System.out.println(allElements);

    for (WebElement element: allElements) {
        System.out.println(element.getText());
        element.click();          
    }
}

提前致谢。

【问题讨论】:

  • 附件丢失,请详细说明您要执行的操作。

标签: java html selenium selenium-webdriver


【解决方案1】:

你可以像这样使用:

driver.findElements(By.xpath("//li[contains(@class,'managed-services')]/ul/li/a"));

使用附加到 html 根目录的 XPath(即绝对 xpath)通常是个坏主意,您应该始终尝试使用尽可能短的选择器,即相对 xpath。

还请记住,如果链接被隐藏,您需要触发操作,以启用它们 - 例如打开菜单。

【讨论】:

    【解决方案2】:

    你可以试试下面的代码。

    只需根据您的应用程序更改 xpath。

    List<WebElement> liElements = driver.findElements(By.xpath(".//*[@id='fk-mainhead-id']/div[2]/div/div/ul/li"));
            System.out.println(liElements);
    
            for(int i=1; i <= liElements.size(); i++)
            {
                WebElement linkElement = driver.findElement(By.xpath(".//*[@id='fk-mainhead-id']/div[2]/div/div/ul/li[" + i + "]/a"));
                System.out.println(linkElement.getText());      
    
            }
    

    【讨论】:

    • 因为int i初始化为1,所以条件应该是
    【解决方案3】:

    详细信息尚不清楚,但您似乎正在尝试在页脚的 INDUSTRIES 部分打印链接。如果这是真的,这应该可行。

    driver.get("https://dev.www.tycois.com/");
    WebElement industries = driver.findElement(By.cssSelector("div.columns.three.alpha > ul"));
    List<WebElement> links = industries.findElements(By.tagName("li"));
    for (int i = 1; i < links.size(); i++)
    {
        System.out.println(links.get(i).getText());
    }
    

    您无法单击此循环中的链接,因为一旦单击第一个链接,您将不再出现在页面上。我建议您将每个链接的 URL 存储在一个数组中,然后为每个链接存储 driver.get(url)。或者,您可以将预期的 URL 存储在一个数组中,并将链接中的 URL 与预期的 URL 进行比较,而根本不需要导航。选择权在你...

    【讨论】:

      【解决方案4】:

      JeffC 的解决方案适用于下面详述的调整 -

      driver.get("https://dev.www.tycois.com/");
      WebElement industries = 
      driver.findElement(By.cssSelector("div.columns.three.alpha > ul"));
      List<WebElement> links = industries.findElements(By.tagName("li"));
      for (int i = 0; i < links.size(); i++)
      {
          System.out.println(links.get(i).getText());
      }
      

      上面的替代答案,我无法评论,因为我是该网站的新手

      for(int i=1; i < links.size(); i++)
      

      但是这会丢失列表中的第一个元素。建议使用的修复 -

      for(int i=1; i <= links.size(); i++)
      

      将导致 IndexOutOfBoundsException。

      要解决此问题,只需将迭代器设置为从 0 而不是 1 开始

      【讨论】:

        猜你喜欢
        • 2022-12-05
        • 2019-10-18
        • 2016-01-05
        • 2011-08-26
        • 1970-01-01
        • 2016-08-31
        • 1970-01-01
        • 2015-04-09
        • 2021-07-27
        相关资源
        最近更新 更多