在selenium中我们使用了以下语法: List rows = driver.findElements(By.xpath(“”));
在这种语法中,我们在对象引用“rows”中存储了许多值。
但我的问题是在这个语法中我们用来存储值的列表类型是什么?
答案 0 :(得分:0)
以下是您的问题的答案:
当你提到:
List rows = driver.findElements(By.xpath(""));
Java基本上创建了一个List
,它可以容纳Object
类型raw type
的几个项目,但会抱怨并提供建议将其更改为List
generic type
。
例如,如果您在IDE中放置raw List
的以下代码并将鼠标悬停在raw List
上,您会看到Java Compiler
抱怨:
最佳做法表明,我们应始终根据项目类型创建通用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>
。
在这种情况下,Java编译器对您的代码没有任何抱怨。
如果这回答您的问题,请告诉我。
答案 1 :(得分:0)
WebDriver
是接口,它要求实现返回List
,但它没有指定哪个特定列表,这取决于实现。并且有几种实现方式。
请注意,List
只是界面,还有多个实施,例如ArrayList
,LinkedList
等。您可以在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。
我们看到例如ChromeDriver
和FirefoxDriver
继承自RemoteWebDriver。它的findElements
方法将任务委托给作为抽象类的By对象,因此我们需要转到By
的具体实现,依此类推。
最后,使用 XPath ,我们降落在用于查找匹配项的BaseFinder类。该课程最终使用ArrayList
。