在Selenium中,类型为“list”的方法FindElement存储该值

时间:2017-07-29 11:20:24

标签: java selenium selenium-webdriver

在selenium中我们使用了以下语法: List rows = driver.findElements(By.xpath(“”));

在这种语法中,我们在对象引用“rows”中存储了许多值。

但我的问题是在这个语法中我们用来存储值的列表类型是什么?

2 个答案:

答案 0 :(得分:0)

以下是您的问题的答案:

当你提到:

List rows = driver.findElements(By.xpath(""));

Java基本上创建了一个List,它可以容纳Object类型raw type的几个项目,但会抱怨并提供建议将其更改为List generic type

例如,如果您在IDE中放置raw List的以下代码并将鼠标悬停在raw List上,您会看到Java Compiler抱怨:

enter image description here

最佳做法表明,我们应始终根据项目类型创建通用List。创建由List返回的WebElements来存储driver.findElements(By.xpath("my_xpath"))的理想方法如下:

List<WebElement> dd_menu = driver.findElements(By.xpath("//ul[@class='dropdown-menu']//li/a"));

现在,如果您将鼠标悬停在方法findElements()上,您会看到findElements()方法始终返回List<WebElement>

enter image description here

在这种情况下,Java编译器对您的代码没有任何抱怨。

如果这回答您的问题,请告诉我。

答案 1 :(得分:0)

WebDriver接口,它要求实现返回List,但它没有指定哪个特定列表,这取决于实现。并且有几种实现方式。

请注意,List只是界面,还有多个实施,例如ArrayListLinkedList等。您可以在documentation中看到(标准API的)实现类的完整列表。

我目前的 Geckodriver (Firefox系列)和 Chromedriver (Chrome系列)与By.tagName一起使用时返回LinkedList

然而,如上所述,其他实现可以返回其他List个对象,并且无法保证gecko和chromedriver将来也总是返回LinkedList,他们可以将其更改为接口只需要List

请注意,您始终可以使用Object#getClass方法检查对象的当前类型。

List rows = driver.findElements(By.xpath(""));
System.out.println(rows.getClass());

另请注意,如果是Selenium,您可以查看实现,它是开源的:Selenium at GitHub

我们看到例如ChromeDriverFirefoxDriver继承自RemoteWebDriver。它的findElements方法将任务委托给作为抽象类的By对象,因此我们需要转到By的具体实现,依此类推。

最后,使用 XPath ,我们降落在用于查找匹配项的BaseFinder类。该课程最终使用ArrayList