“PageFactory.initElements(driver,this);”如何处理WebElements列表?

时间:2018-06-09 07:10:47

标签: java selenium

我只想知道PageFactory.initElements(驱动程序,这个)如何填充searchSuggestions webElement,以及如果我没有使用thread.sleep(500),它会使用thread.sleep抛出过时的元素引用异常它工作正常。

public SearchObjects(WebDriver driver) 
{
    this.driver = driver;
    PageFactory.initElements(driver, this);
}
@FindBy(id="navbar-query")
WebElement searchBar;

@FindBy(xpath="//div[@class='navbar-suggestionsearch__search-result']")
List<WebElement> searchSuggestions;

public SearchObjects(WebDriver driver) 
{
    this.driver = driver;
    PageFactory.initElements(driver, this);
}
public void searchOnImdb(WebDriver driver, String str) throws InterruptedException
{
    searchBar.sendKeys(str);
    Thread.sleep(500);
}

1 个答案:

答案 0 :(得分:1)

PageFactory.initElements()仅为标注为注释@FindBy的变量创建代理。此方法实际上不会搜索这些元素。对于WebElementWebElement的{​​{1}}代理的创建方式与List<WebElement>类似。

请参阅调用方法initElements()的{​​{3}}方法proxyFields()。在此方法中,decorate()的{​​{1}}方法称为 - https://github.com/SeleniumHQ/selenium/blob/master/java/client/src/org/openqa/selenium/support/PageFactory.java。在decorate()方法中,您将找到使用相应Decorator创建的相应代理。 InnvocationHandler处理元素的实际搜索等。

现在,当使用InnvocationHandler之类的东西时,它首先进入调用实际方法的代理。 - https://github.com/SeleniumHQ/selenium/blob/master/java/client/src/org/openqa/selenium/support/pagefactory/DefaultFieldDecorator.javahttps://github.com/SeleniumHQ/selenium/blob/master/java/client/src/org/openqa/selenium/support/pagefactory/internal/LocatingElementListHandler.java

尝试使用driver.findElements() - https://github.com/SeleniumHQ/selenium/blob/master/java/client/src/org/openqa/selenium/support/pagefactory/internal/LocatingElementHandler.java的明确等待。