2

我正在使用页面对象模型创建我的项目,

要定义简单元素,最简单的定义是

By loginEmailParse = By.id("signIn-email");

并称之为:driver.findElement(loginEmailParse);

但是,当我们有带变量的条件时,

By.xpath("//input[@id='" + accountID + "']")

By.xpath("//input[@id='" + accountID + "']//following::i[@class='far fa-sign-in addPointer']")

这里的“accountID”是可变的,

我们如何定义它?

4

2 回答 2

0

在这种情况下,您无法创建变量。您必须在将变量作为参数传递的方法中传递 xpath。

public void clickElement(String accountID){
driver.findElement(By.xpath("//input[@id='" + accountID + "']")).click();
}
于 2018-07-20T09:39:01.173 回答
0

根据您的问题和下面提供的示例代码,让我们假设click()在元素elemA上调用会使DOM 树中的另一个元素可单击,您需要为此诱导WebDriverWaitExpectedConditions结合,如下所示:

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支持的大多数东西都采用WebElementlocator。如果您无法找到动态元素作为替代,请不要使用PageFactory来初始化该字段,而只需自己进行查找。

于 2018-07-20T15:04:02.290 回答