硒中的WebElements与WebElement的区别

时间:2018-10-24 08:34:40

标签: java selenium

我正在从facebook上获取日期网络元素,并使用下面的代码对其进行循环。

public class select_facebook {
    public static void main(String[] args) throws Exception {
        WebDriver driver = new FirefoxDriver();
        driver.get("http://www.facebook.com");
        List<WebElement> days = driver.findElements(By.xpath("//select[@id='day']"));

         System.out.println(days.size()); 

        for (int i=0;i<days.size();i++) {
            System.out.println(days.get(i));
        }


    }

}

但是我得到的输出是

1

[[FirefoxDriver: firefox on XP (58765a0e-31a0-40bc-8565-3418ae54682c)] -> xpath: //select[@id='day']]

但是如果我使用System.out.println(days.get(i).gettext());

,则for循环中的代码相同

它列出了所有日期1到31。

那我的问题是,为什么我应该这样称呼

List<WebElement> days = driver.findElements(By.xpath("//select[@id='day']"));

因为甚至webElements的大小仅为:1

System.out.println(days.size());

相反,我可以这样称呼它

WebElement days = driver.findElement(By.xpath("//select[@id='day']"));

2 个答案:

答案 0 :(得分:1)

您将获得

的元素列表。
List<WebElement> days = driver.findElements(By.xpath("//select[@id='day']"));

因为同一id(“天”)可能有1个以上的元素。

答案 1 :(得分:1)

您应该专注于您真正需要的东西。如果要使用更多元素,请使用FindElements(),如果您只对一个元素感兴趣,请使用FindElement()

如果元素数量更多,并且如果您使用FindElement(),它将返回您的第一个元素,而其他元素则被忽略。因此,请确保您的要求。

这是因为id值只能分配给一个HTML元素。换句话说,仅在有效的HTML DOM中,多个元素不能在同一页面上具有相同的id值。

FindElement()会返回WebElement:

WebElement SINGLEELEMENT= driver.findElement(By.SELECTOR("//TAGNAME[@ATTRIBUTENAME='ATTRIBUTEVALUE']"));

FindElements()会返回WebElement,即多个元素的List<WebElement>。如果仅存在一个元素,则返回1;如果存在多个,则返回多个:

List<WebElement> LISTOFELEMENTS= driver.findElements(By.SELECTOR("//TAGNAME[@ATTRIBUTENAME='ATTRIBUTEVALUE']"));

您可以在其上循环以获取每个元素并分别进行处理。