在Selenium Webdriver中的复杂表中查找数据

时间:2014-02-05 23:37:46

标签: java selenium selenium-webdriver html-table

我目前正在尝试使用Selenium webdriver在一个充满用户的表中向下钻取用户,我已经研究了如何遍历表格,但我实际上在选择我想要的人时遇到了麻烦。

这是HTML(由于它不是我的数据而用X修改)

<table id="XXXXXXXXX_list" cellspacing="0" cellpadding="0" style=" border:0px black solid;WIDTH:100%;">
<tbody>
<tr cellspacing="0" style="height: 16px;">
<tr>
<tr onclick="widgetListView_onClick('XXXX_list',1,this,event)">
<tr onclick="widgetListView_onClick('XXXX_list',2,this,event)">
<tr onclick="widgetListView_onClick('XXXX_list',3,this,event)">
<tr onclick="widgetListView_onClick('XXXX_list',4,this,event)">
<tr onclick="widgetListView_onClick('XXXX_list',5,this,event)">
<tr onclick="widgetListView_onClick('XXXX_list',6,this,event)">
<tr onclick="widgetListView_onClick('XXXX_list',7,this,event)">
<td class="listView_default_dataStyle" nowrap="" style="font-size:12px ;
font-family: sans-serif ;color: black ;background: #FFFFFF " 
ondblclick="XXXXListView_onDblClick('XXXXX_list',17, event)">NAME</td>
<td class="listView_default_dataStyle" nowrap="" style="font-size:12px ;font-family: sans-serif;
color: black ;background: #FFFFFF " ondblclick="XXXXX_onDblClick('XXXX_list',17, event)"> </td>
</tr>

以下是我正在编写的代码,试图通过表格中的NAME找到用户。

WebElement table = driver.findElement(By.id("table_list"));

    // Now get all the TR elements from the table
    List<WebElement> allRows = table.findElements(By.tagName("tr"));
    // And iterate over them, getting the cells
    for (WebElement row : allRows) {
     List<WebElement> cells = row.findElements(By.tagName("td"));
     for (WebElement cell : cells) {         
        List<WebElement> Names = cell.findElements(By.xpath("//td[text()='NAME']"));
        System.out.println(Names);

这只打印了数千个[](该表在实际应用中非常庞大)。 基本上我需要的是当我找到正确的名称并从该表行创建一个web元素时停止。然后我可以点击并向下钻取。

对不起,如果这有点含糊不清,

2 个答案:

答案 0 :(得分:1)

如果表中的每个名称都是唯一的,那么您不需要太多复杂的事情。只需搜索与“名称”匹配的文本元素,然后相应地选择行。请看下面的代码:

WebElement name = driver.findElement(By.xpath("//table[@id='XXXXXXXXX_list']//td[contains(text(),'NAME')]"));//Select td with text NAME in table with id XXXXXXXXX_list
WebElement rowWithName = name.findElement(By.xpath("./.."));//Select the parent node, i.e., tr, of the td with text NAME
/*
 * Look into that row for other element or perform any action on the row.
 */

如果名称不是唯一的,即同一名称在同一节点存在两次,则每次都会选择第一个实例。在这种情况下,我们将不得不尝试不同的方式,即我们必须索引xpath以获得匹配名称的正确实例。如果你有任何疑问,请问:)

答案 1 :(得分:-1)

这会帮助你。

     try{
ArrayList<WebElement> cells = (ArrayList<WebElement>) driver.findElements(By.tagName("td"));
log4j.info("Value = "+input_type+" is stored in array from Webpage for "+keyword+" ");
for(WebElement type : cells)
{
    if(type.getAttribute("name").equals("your correct name here")) {

        type.sendKeys("ABC");

    }
}
return true;
}catch(Throwable e){
    return false;
}

你需要使用像这样的数组列表,你可以比较你想要填充值的名称或想做任何操作,如getText(),点击()等。

享受!