我的问题是:装饰有findby属性的Webelements是否在每次引用它们时调用findelement函数?如果没有,什么时候?
用List 装饰的程序是什么?当您引用列表或引用列表中的元素时,它会触发吗?
我之所以问是因为,在某些情况下,我会遇到过时的元素异常,并且我想知道如何处理它们。
WebElement的计算是惰性的。也就是说,如果您从不在PageObject中使用WebElement字段,则永远不会调用它的“ findElement”。参考。
如果不想WebDriver每次都查询元素,则必须使用@CacheLookup注释。
WebDriver
@CacheLookup
那我的问题清单部分呢?
从列表中查询时将触发findElements。说您有:
@FindBy(xpath = "//div[@class=\"langlist langlist-large\"]//a") private List<WebElement> list;
以下代码示例均 触发 findElements:
list.isEmpty();
WebElement element = list.get(0);
在哪里
List<WebElement> newList = new ArrayList<WebElement>(); newList = list;
不会触发 findElements()。
请检查LocatingElementListHandler课程。我建议深入探讨答案。
LocatingElementListHandler
您可能会发现PageFactory类中的以下代码注释有帮助:
/** * Instantiate an instance of the given class, and set a lazy proxy for each of the WebElement * and List<WebElement> fields that have been declared, assuming that the field name is also * the HTML element's "id" or "name". This means that for the class: * * <code> * public class Page { * private WebElement submit; * } * </code> * * there will be an element that can be located using the xpath expression "//*[@id='submit']" or * "//*[@name='submit']" * * By default, the element or the list is looked up each and every time a method is called upon it. * To change this behaviour, simply annotate the field with the {@link CacheLookup}. * To change how the element is located, use the {@link FindBy} annotation. * * This method will attempt to instantiate the class given to it, preferably using a constructor * which takes a WebDriver instance as its only argument or falling back on a no-arg constructor. * An exception will be thrown if the class cannot be instantiated. * * @see FindBy * @see CacheLookup * @param driver The driver that will be used to look up the elements * @param pageClassToProxy A class which will be initialised. * @return An instantiated instance of the class with WebElement and List<WebElement> fields proxied */