如何在页面对象模型上传递变量值

时间:2018-07-20 09:34:58

标签: java selenium selenium-webdriver pageobjects page-factory

我正在使用Page Object Model创建项目,

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

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”在此处是变量

我们如何定义它?

2 个答案:

答案 0 :(得分:0)

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

public void clickElement(String accountID){
driver.findElement(By.xpath("//input[@id='" + accountID + "']")).click();
}

答案 1 :(得分:0)

根据您的问题和下面提供的示例代码,让我们假设在元素{em> elemA 上调用click()使{{3}中的另一个元素 clickable },您需要为此与DOM Tree进行WebDriverWait共轭:

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();
    }
}

在讨论ExpectedConditions中,根据Simon的说法:

  

ExpectedConditions支持的大多数东西都使用WebElement或定位器。如果找到一个没有的定位器,那么您需要做的就是找出要使用的正确定位器。除非您使用@FindBy批注,否则它是By.name或By.id。如果您使用了注释,那么生活就很简单---它就在代码中。另外,不要使用PageFactory初始化该字段,而自己进行查找。

     

请记住,PageFactory就在那里尝试为您节省一些样板。您总是可以在不适合您特定用例的地方使用它。

结论

ExpectedConditions 支持的大多数东西都使用 WebElement locator 。如果您找不到动态元素作为替代方案,请不要使用 PageFactory 初始化该字段,而自己进行查找。