如何使用 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;
其他两个也一样。数据将按照页面上的顺序排列。您可以使用列表中的索引轻松访问数据。
我有一个 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;
其他两个也一样。数据将按照页面上的顺序排列。您可以使用列表中的索引轻松访问数据。