如何在 Selenium WebDriver 中获取“ul”类的所有“li”元素

Posted

技术标签:

【中文标题】如何在 Selenium WebDriver 中获取“ul”类的所有“li”元素【英文标题】:How to get all "li" elements of "ul" class in Selenium WebDriver 【发布时间】: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();          
    

提前致谢。

【问题讨论】:

附件丢失,请详细说明您要执行的操作。 【参考方案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 开始

【讨论】:

以上是关于如何在 Selenium WebDriver 中获取“ul”类的所有“li”元素的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 在 Selenium WebDriver (Selenium 2) 中最大化浏览器窗口?

如何使用selenium webdriver来判断一个网页加载完毕

如何在 ruby​​ 中使用 Selenium WebDriver (selenium 2.0) 客户端设置选项

如何在python selenium chrome webdriver中设置标头

如何在 Java 中使用 Selenium WebDriver (Selenium 2) 输入文本框?

如何在 selenium-webdriver 中为 phantomjs 驱动程序设置一个用户代理?