我只想知道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);
}
答案 0 :(得分:1)
PageFactory.initElements()
仅为标注为注释@FindBy
的变量创建代理。此方法实际上不会搜索这些元素。对于WebElement
,WebElement
的{{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.java和https://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的明确等待。