如何使用 selenium 中的页面工厂处理页面对象模型中的动态 html 表?

How to handle dynamic html tables in page object model using page fatory in selenium?

我有一个 HTML 页面并创建了该页面的页面对象。此页面包含动态 html table。我无法将它用作页面对象,因为它是动态创建的。我想在我的测试用例中使用页面的任意行和列。

页面对象class:

public final class AgentsPage 
{
@FindBy(how=How.XPATH, using="//table[@id='gwt-debug-com.seamless.ers.client.agentPortal.client.view.screens.SubAgentsReportScreen']//input[@id='gwt-debug-Phone_Number']")
public WebElement phoneNumber;

public String getTextOfPhoneNumber()
{
    return phoneNumber.getAttribute("value");
}

public void setTextForPhoneNumber(String value)
{
    phoneNumber.clear();
    phoneNumber.sendKeys(value);
}

@FindBy(how=How.XPATH, using="//table[@id='gwt-debug-com.seamless.ers.client.agentPortal.client.view.screens.SubAgentsReportScreen']//input[@id='gwt-debug-Name']")
public WebElement name;

public String getTextOfName()
{
    return name.getAttribute("value");
}

public void setTextForName(String value)
{
    name.clear();
    name.sendKeys(value);
}

@FindBy(how=How.XPATH, using="//table[@id='gwt-debug-com.seamless.ers.client.agentPortal.client.view.screens.SubAgentsReportScreen']//input[@id='gwt-debug-Reseller_ID']")
public WebElement resellerId;

public String getTextOfResellerId()
{
    return resellerId.getAttribute("value");
}

public void setTextForResellerId(String value)
{
    resellerId.clear();
    resellerId.sendKeys(value);
}

@FindBy(how=How.XPATH, using="//table[@id='gwt-debug-com.seamless.ers.client.agentPortal.client.view.screens.SubAgentsReportScreen']//input[@id='gwt-debug-Terminal_Serial']")
public WebElement terminalSerial;

public String getTextOfTermialSerial()
{
    return terminalSerial.getAttribute("value");
}

public void setTextForTerminalSerial(String value)
{
    terminalSerial.clear();
    terminalSerial.sendKeys(value);
}

@FindBy(how=How.XPATH, using="//table[@id='gwt-debug-com.seamless.ers.client.agentPortal.client.view.screens.SubAgentsReportScreen']//select[@id='gwt-debug-Rows_Per_Page']")
public WebElement rowsPerPage;

public String getSelectedValueOfRowsPerPage()
{
    Select select=new Select(rowsPerPage);
    return select.getFirstSelectedOption().getText();
}

public void setValueForRowsPerPage(String visibleText)
{
    if(!(visibleText.equals("")||visibleText==null))
    {
        Select select=new Select(rowsPerPage);
        select.selectByVisibleText(visibleText);
    }
}

public void setValueForRowsPerPage(int index) throws Exception
{
    Select select=new Select(resellerId);
    select.selectByIndex(index);
}

@FindBy(how=How.XPATH, using="//table[@id='gwt-debug-com.seamless.ers.client.agentPortal.client.view.screens.SubAgentsReportScreen']//button[@id='gwt-debug-submit_button']")
public WebElement submit;

public String getTextOfSubmit()
{
    return submit.getText();
}

@FindBy(how=How.XPATH, using="//table[@id='gwt-debug-com.seamless.ers.client.agentPortal.client.view.screens.SubAgentsReportScreen']//button[@id='gwt-debug-clear_button']")
public WebElement reset;

public String getTextOfReset()
{
    return reset.getText();
}

@FindBy(how=How.XPATH, using="//table[@id='gwt-debug-com.seamless.ers.client.agentPortal.client.view.screens.SubAgentsReportScreen']//button[@id='gwt-debug-nextPage']")
public WebElement next;

public String getTextOfNext()
{
    return next.getText();
}

@FindBy(how=How.XPATH, using="//table[@id='gwt-debug-com.seamless.ers.client.agentPortal.client.view.screens.SubAgentsReportScreen']//button[@id='gwt-debug-prevPage']")
public WebElement previous;

public String getTextOfPrevious()
{
    return previous.getText();
}

@FindBy(how=How.XPATH, using="//table[@id='gwt-debug-com.seamless.ers.client.agentPortal.client.view.screens.SubAgentsReportScreen']//button[@id='gwt-debug-lastPage']")
public WebElement last;

public String getTextOfLast()
{
    return last.getText();
}

@FindBy(how=How.XPATH, using="//table[@id='gwt-debug-com.seamless.ers.client.agentPortal.client.view.screens.SubAgentsReportScreen']//button[@id='gwt-debug-firstPage']")
public WebElement first;

public String getTextOfFirst()
{
    return first.getText();
}

@FindBy(how=How.XPATH, using="//table[@id='gwt-debug- com.seamless.ers.client.agentPortal.client.view.screens.SubAgentsReportScreen']//div[contains(text(),'Page:') and contains(text(),'/')]")
public WebElement pageCount;

public String getTextOfPageCount()
{
    return pageCount.getText();
}
//Need page objects for the dynamic html table
}

![页面图片][1]: http://i.stack.imgur.com/o94F0.png

我不想在测试用例中使用任何 xpath 或任何循环遍历 table 的行。我只想像 AgentsPage.submit 按钮这样的任何其他静态页面对象元素一样使用它。如何实现?

如果没有 xPath,您甚至无法找到 table 的所需元素(当然您可以使用 CssSelectors,但它是一样的)。

做对了我建议您创建一个包含 table 行(<tr> 标记)的 Web 元素列表。此列表应由 @FindBy 属性初始化。

那么我想为您的数据创建 "get" 方法是个好主意。

例如:

public String getName(int row, int cell)
{
    return theTable[row].findElement(By.xpath(".//td[" + cell + "]")).getText();
}

将行号、phone 编号、名称等网络元素存储在自己的列表中。您可以使用流轻松地将数据作为字符串获取。

@FindBy(xpath="xpath to the row number")
private List<WebElement> rowNum;

@FindBy(xpath="xpath to the phone number")
private List<WebElement> phoneNum;

其他两个也一样。数据将按照页面上的顺序排列。您可以使用列表中的索引轻松访问数据。