WebDriver / PageObject / FindBy:如何使用动态值指定xpath?

Rac*_*oon 5 java selenium xpath pageobjects selenium-webdriver

我正在尝试在Java中使用Page Object模式,并且@ FindBy / XPath遇到了一些麻烦。

之前,我在Groovy中使用了以下构造:

driver.findElement(By.xpath("//td[contains(text(),'$SystemName')]")).click()

Here, SystemName is a parameter that can be different. 
Run Code Online (Sandbox Code Playgroud)

现在,我想做同样的事情,但是要遵循Java中的Page Object范式:

public class ManagedSystems {

    private WebDriver driver;

    @FindBy(id="menu_NewSystem")
    private WebElement menuNewSystem;

    @FindBy (xpath = "//td[contains(text(),'$SystemName')]")  // ??? How to use SystemName from deleteSystem method (below)?
    private WebElement plantSystemName;

    ....

    public SystemHomePage deleteSystem (String systemName) {

        plantSystemName.click();

    }

}
Run Code Online (Sandbox Code Playgroud)

在测试中,我调用deleteSystem:

SystemHomePage.deleteSystem("Firestone");
Run Code Online (Sandbox Code Playgroud)

问题:如何为PlantSystemName为deleteSystem指定的SystemName链接@FindBy表示法

谢谢浣熊

小智 6

我为此使用了另一种解决方法,即使使用页面工厂,它也允许我们使用动态 xpath。

解决方案:添加任何静态父元素的 xpath,并使用动态路径引用子元素。在您的情况下,//td[contains(text(),'$SystemName'),td 的父元素可能是 'tr' 或 'table'。如果表是静态的,请使用以下代码:

@FindBy(xpath = "<..table xpath>")
public WebElement parentElement; 

public WebElement getDynamicEmement(String SystemName){
  parentElement.findElement(By.xpath("//tr/td[contains(text(),'"+SystemName+"')]"))
}
Run Code Online (Sandbox Code Playgroud)

现在在您的脚本中,首先访问表(以便将其引用加载到内存中),然后调用 getDynamicElement 方法。

waitForElement(parentElement)
getDynamicElement("System-A")
Run Code Online (Sandbox Code Playgroud)


Rac*_*oon 3

感谢 Ardesco 和 Robbie,我想出了以下解决方案:

private String RequiredSystemNameXpath = "//td[contains(text(),'xxxxx')]";

private WebElement prepareWebElementWithDynamicXpath (String xpathValue, String substitutionValue ) {

        return driver.findElement(By.xpath(xpathValue.replace("xxxxx", substitutionValue)));
}

public void deleteSystem (String systemName) {


    WebElement RequiredSystemName = prepareWebElementWithDynamicXpath(RequiredSystemNameXpath, systemName);

    RequiredSystemName.click();

}
Run Code Online (Sandbox Code Playgroud)