根据您的问题和下面提供的示例代码,让我们假设click()
在元素elemA上调用会使DOM 树中的另一个元素可单击,您需要为此诱导WebDriverWait与ExpectedConditions结合,如下所示:
public class LoginPageNew
{
WebDriver driver;
//constructor
public LoginPageNew(WebDriver loginDriver)
{
this.driver=loginDriver;
}
@FindBy(id="element1")
@CacheLookup
WebElement elemA;
public void login_wordpress(String accountID)
{
elemA.click();
new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//input[@id='" + accountID + "']//following::i[@class='far fa-sign-in addPointer']"))).click();
}
}
根据 Simon 在讨论中如何使用 PageFactory 字段和 PageObject 模式的显式等待:
ExpectedConditions 支持的大多数东西都采用 WebElement 或定位器。如果您发现一个没有,那么您需要做的就是找出要使用的正确定位器。除非您使用了 @FindBy 注释,否则这是 By.name 或 By.id。如果您使用了注解,那么生活就很简单 --- 它就在代码中。或者,不要使用 PageFactory 来初始化该字段,而自己进行查找。
请记住,PageFactory 只是为了尝试为您节省一些样板文件。您始终可以在不适合您的特定用例的情况下不使用它。
结论
由于ExpectedConditions支持的大多数东西都采用WebElement或locator。如果您无法找到动态元素作为替代,请不要使用PageFactory来初始化该字段,而只需自己进行查找。