如何通过Selenium和Page Factory实现AjaxElementLocatorFactory?

4

我在Selenium中使用了Pagefactory来设置所有页面。问题在于测试是动态的,因为某些元素仅存在于某些测试中。从我的理解来看,AjaxElementFactory的工作方式如下:

PageFactory.initElements(new AjaxElementLocatorFactory(driver,5), this);

@FindBy(id="ctl00_DefaultContent_RbIndividual")
WebElement OwnershipIndividual;

public void sendString(String stuff){
    OwnershipIndividual.sendKeys(stuff);
}

但是如果在5秒钟内没有找到OwnershipIndividual元素,则会抛出NoSuchElementException异常。我的问题是,尽管我将超时时间设置为5秒钟,但它仍需要50-60秒才能超时。为什么会这样呢?


1
50-60秒后会抛出什么超时?您是否也在使用WebDriverWait - JeffC
1
@JeffC 这与我在创建WebDriver时设置的隐式等待有关。在删除了20秒(而不是50-60秒)的隐式等待后,AjaxElementLocatorFactory正常工作了。我的猜测是隐式等待会覆盖AjaxElementLocatorFactory使用的显式等待,但这仍然无法解释为什么会在50秒而不是20或25秒后抛出超时异常。 - ZantAgg
4
文档明确指出不要混合使用隐式等待和显式等待,因为超时可能会出现错误。听起来这可能是您看到的情况。 Selenium 的贡献者已经声明不要使用隐式等待。建议只需删除所有隐式等待,并根据需要添加 WebDriverWait,正如他们所推荐的那样。 - JeffC
@ZantAgg,我认为这个问题的标题应该改一下。 - Sandeep Nalla
2个回答

1

你可能已经为你的驱动程序提供了隐式等待,这会与你的AjaxElementLocatorFactory超时时间相加。


1
你的回答目前不够清晰,请编辑并添加更多细节以帮助其他人理解你如何回答问题。你可以在帮助中心找到有关如何撰写良好答案的更多信息。 - Pashyant Srivastava

0

我在你的代码尝试中没有看到任何问题。

AjaxElementLocatorFactory

AjaxElementLocatorFactory页面工厂模式中的延迟加载概念,仅在使用WebElements时才进行识别,即可以通过AjaxElementLocatorFactory为对象页面类分配WebElement的超时时间。

  • 语法:

    PageFactory.initElements(new AjaxElementLocatorFactory(driver, TimeoutValue), this);
    
  • 示例:

    PageFactory.initElements(new AjaxElementLocatorFactory(driver,5), this);
    
以上代码将等待最多5秒钟,直到注释指定的元素被加载。如果在给定的时间范围内未找到该元素,则会抛出NoSuchElementException异常。
因此,根据您的代码块,如果在5秒钟后未找到该元素,则应抛出NoSuchElementException异常。

了解内部结构

AjaxElementLocatorFactory会使用SlowLoadableComponent创建一个AjaxElementLocator,但是在load()方法返回时,页面可能还没有加载完成。因此,在调用load()方法之后,isLoaded()方法应该继续返回失败,直到组件完全加载完成。


2
没有一个回答解决了问题。问题是,“我的问题是,尽管我已经将超时设置为5秒,但它仍然需要50-60秒才能超时。为什么会这样?”而你解释说在5秒后应该会抛出异常,但OP明确表示需要50-60秒。 - JeffC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接