我一直在思考selenium webdriver中的这段代码。现在,我确实理解Interfaces无法实例化,为此我们应该通过实现相同的类来实现。
代码如下:
List<WebElement> divElements ;
divElements = driver.findElements(By.tagName("div"));
是否可以分配如上所示的值(为什么?)或不应该:
List<WebElement> divElements=new ArrayList<>(); ;
divElements = driver.findElements(By.tagName("div"));
代码1是如何工作的?如果有人能澄清的话。
答案 0 :(得分:2)
driver.findElements()的返回值是单个对象:WebElements列表。 这可以分配给变量divElements,就是这样。
您不必为结果分配空ArrayList。这是无效的,将丢失并在以下情况下收集垃圾:
divElemens = driver.findElements(..)
答案 1 :(得分:2)
两个片段之间的效果没有区别。
将任何变量(除了原始类型之一)视为对象的标签,而不是像一个小便条。您可以创建标签,将其粘贴在对象上,如果愿意,可以将其移动到另一个对象。您甚至可以将变量设置为null
,这意味着它根本不会粘在对象上。
代码new ArrayList<>()
创建一个新对象。第二个代码段中的代码会在该对象上放置一个标签(变量),但会立即将标签移动到完全不同的对象上。这使得原始ArrayList
完全无关紧要。在其中一个代码段之后,变量divElements
将粘贴到findElements
方法返回的对象上。
答案 2 :(得分:1)
List<WebElement>
类型的所有变量(以及java中的任何类类型)都是 references 。当你说
divElements = driver.findElements(By.tagName("div"));
它将divElements
设置为findElements
返回的任何引用。可能是findElements
已经实例化了一个新对象,它是一个List
(它可以是任何实现List
的类);或者findElements
可能会返回对之前创建的某个对象的引用;或者它可能会返回null
。它并不重要。无论对象divElements
之前引用的是什么,如果有的话,也无关紧要。引用将被新引用替换。
事情就在这里,除非findElements
返回null
,实现List
的对象 实例化 ,某个地方。首先这样做:
List<WebElement> divElements = new ArrayList<>();
只是意味着您将divElements
设置为对新对象的引用,该对象将被抛弃。它没有任何有益的效果。