Java 如何使用Selenium计算和选择Web表中的一些行?

Java 如何使用Selenium计算和选择Web表中的一些行?,java,selenium,automated-tests,selenium-chromedriver,xpath,Java,Selenium,Automated Tests,Selenium Chromedriver,Xpath,我正在使用SeleniumWebDriver和Java开发一个自动化测试,我需要确保web表中有项,并选择其中一项,但ID是动态的 HTML代码: <table class="datagrid-btable" cellspacing="0" cellpadding="0" border="0" style="table-layout: auto;"> <tbody> <tr id="datagrid-row-r4-2-0" datagrid-row

我正在使用SeleniumWebDriver和Java开发一个自动化测试,我需要确保web表中有项,并选择其中一项,但ID是动态的

HTML代码:

<table class="datagrid-btable" cellspacing="0" cellpadding="0" border="0" style="table-layout: auto;">    <tbody>
      <tr id="datagrid-row-r4-2-0" datagrid-row-index="0" class="datagrid-row datagrid-row-selected">
         <td field="PLANT_CODE" style="display:none;">
            <div style="text-align: left;" class="datagrid-cell datagrid-cell-c4-PLANT_CODE">1001</div>
         </td>
         <td field="PLANT_NM">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-PLANT_NM">TESTE1</div>
         </td>
         <td field="PU_NAME" style="display:none;">
            <div style=";text-align:left;" class="datagrid-cell datagrid-cell-c4-PU_NAME"></div>
         </td>
         <td field="SUPPLIER_CODE">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-SUPPLIER_CODE">SUP001AR</div>
         </td>
         <td field="SUPPLIER_NM">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-SUPPLIER_NM">SUPPLIER 001 AR</div>
         </td>
         <td field="ITEM_CODE">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-ITEM_CODE">ITEM001AR</div>
         </td>
         <td field="ITEM_NM">
            <div style=";text-align:left;" class="datagrid-cell datagrid-cell-c4-ITEM_NM">ITEM1 AR</div>
         </td>
         <td field="WRHOUSNG_NO" style="display:none;">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-WRHOUSNG_NO"></div>
         </td>
         <td field="ORDE_NO" style="display:none;">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-ORDE_NO"></div>
         </td>
      </tr>
      <tr id="datagrid-row-r4-2-1" datagrid-row-index="1" class="datagrid-row">
         <td field="PLANT_CODE" style="display:none;">
            <div style="text-align: left;" class="datagrid-cell datagrid-cell-c4-PLANT_CODE">1001</div>
         </td>
         <td field="PLANT_NM">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-PLANT_NM">BOCAR LERMA</div>
         </td>
         <td field="PU_NAME" style="display:none;">
            <div style=";text-align:left;" class="datagrid-cell datagrid-cell-c4-PU_NAME"></div>
         </td>
         <td field="SUPPLIER_CODE">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-SUPPLIER_CODE">SUP001AR</div>
         </td>
         <td field="SUPPLIER_NM">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-SUPPLIER_NM">SUPPLIER 001 AR</div>
         </td>
         <td field="ITEM_CODE">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-ITEM_CODE">ITEM001AR</div>
         </td>
         <td field="ITEM_NM">
            <div style=";text-align:left;" class="datagrid-cell datagrid-cell-c4-ITEM_NM">ITEM1 AR</div>
         </td>
         <td field="WRHOUSNG_NO" style="display:none;">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-WRHOUSNG_NO">PUR1</div>
         </td>
         <td field="ORDE_NO" style="display:none;">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-ORDE_NO">PUR1</div>
         </td>
      </tr>    </tbody> </table>
String cell = cols.get(indexCol).getText();
List<WebElement> cols = rows.get(0).findElements(By.tagName("td"));
String cell = cols.get(0).getText();
System.out.println("cell value :" +cell);
在本例中,我的请求返回两行,那么如何计算行数并选择其中一行?
谢谢

您可以使用
findElements
方法获得行数:

List<WebElement> rows = driver.findElements(By.cssSelector(".datagrid-btable tr.datagrid-row"));
System.out.println(rows.size());
要查找所需的行,可以使用
stream().filter()
。在下面的示例中,按
PLANT\u NM
text筛选的行。使用filter或rows iteration,可以编写按任意/多个单元格筛选行的方法:

List<WebElement> rows = driver.findElements(By.cssSelector(".datagrid-btable tr.datagrid-row"));
System.out.println(rows.size());

List<WebElement> filteredRows = rows.stream().filter(element ->
        element.findElement(By.cssSelector("td[field='PLANT_NM'")).getText().equals("BOCAR LERMA"))
        .collect(Collectors.toList());

Assert.assertTrue(filteredRows.size() > 0, "Row with \"BOCAR LERMA\" PLANT_NM exist.");
filteredRows.get(0).click();
List rows=driver.findElements(By.cssSelector(“.datagrid btable tr.datagrid-row”);
System.out.println(rows.size());
List filteredRows=rows.stream().filter(元素->
element.findElement(By.cssSelector(“td[field='PLANT_NM'))).getText().equals(“BOCAR LERMA”))
.collect(Collectors.toList());
Assert.assertTrue(filteredRows.size()>0,“存在带有\“BOCAR LERMA \”工厂的行”);
获取(0)。单击();

您可以使用
findElements
方法获取行数:

List<WebElement> rows = driver.findElements(By.cssSelector(".datagrid-btable tr.datagrid-row"));
System.out.println(rows.size());
要查找所需的行,可以使用
stream().filter()
。在下面的示例中,按
PLANT\u NM
文本筛选的行。使用filter或rows iteration,可以编写按任意/多个单元格筛选行的方法:

List<WebElement> rows = driver.findElements(By.cssSelector(".datagrid-btable tr.datagrid-row"));
System.out.println(rows.size());

List<WebElement> filteredRows = rows.stream().filter(element ->
        element.findElement(By.cssSelector("td[field='PLANT_NM'")).getText().equals("BOCAR LERMA"))
        .collect(Collectors.toList());

Assert.assertTrue(filteredRows.size() > 0, "Row with \"BOCAR LERMA\" PLANT_NM exist.");
filteredRows.get(0).click();
List rows=driver.findElements(By.cssSelector(“.datagrid btable tr.datagrid-row”);
System.out.println(rows.size());
List filteredRows=rows.stream().filter(元素->
element.findElement(By.cssSelector(“td[field='PLANT_NM'))).getText().equals(“BOCAR LERMA”))
.collect(Collectors.toList());
Assert.assertTrue(filteredRows.size()>0,“存在带有\“BOCAR LERMA \”工厂的行”);
获取(0)。单击();

尝试此步骤以获取所需的信息

1.表格初始化

在您的情况下,该表具有类
datagrid btable
,初始化它的方法是:

WebElement tbl = driver.findElement(By.className("datagrid-btable"));
List<WebElement> rows = tbl.findElements(By.tagName("tr"));
2.行初始化

web表行的名称标记通常是
tr
,初始化它的方法是:

WebElement tbl = driver.findElement(By.className("datagrid-btable"));
List<WebElement> rows = tbl.findElements(By.tagName("tr"));
3.列初始化

web表列的名称标记通常为
th
td
,初始化方式如下:

WebElement tbl = driver.findElement(By.className("datagrid-btable"));
List<WebElement> rows = tbl.findElements(By.tagName("tr"));
td
tag

List<WebElement> cols = rows.get(rowIndex).findElements(By.tagName("td"));
row1
中选择
col1
的示例:

<table class="datagrid-btable" cellspacing="0" cellpadding="0" border="0" style="table-layout: auto;">    <tbody>
      <tr id="datagrid-row-r4-2-0" datagrid-row-index="0" class="datagrid-row datagrid-row-selected">
         <td field="PLANT_CODE" style="display:none;">
            <div style="text-align: left;" class="datagrid-cell datagrid-cell-c4-PLANT_CODE">1001</div>
         </td>
         <td field="PLANT_NM">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-PLANT_NM">TESTE1</div>
         </td>
         <td field="PU_NAME" style="display:none;">
            <div style=";text-align:left;" class="datagrid-cell datagrid-cell-c4-PU_NAME"></div>
         </td>
         <td field="SUPPLIER_CODE">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-SUPPLIER_CODE">SUP001AR</div>
         </td>
         <td field="SUPPLIER_NM">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-SUPPLIER_NM">SUPPLIER 001 AR</div>
         </td>
         <td field="ITEM_CODE">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-ITEM_CODE">ITEM001AR</div>
         </td>
         <td field="ITEM_NM">
            <div style=";text-align:left;" class="datagrid-cell datagrid-cell-c4-ITEM_NM">ITEM1 AR</div>
         </td>
         <td field="WRHOUSNG_NO" style="display:none;">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-WRHOUSNG_NO"></div>
         </td>
         <td field="ORDE_NO" style="display:none;">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-ORDE_NO"></div>
         </td>
      </tr>
      <tr id="datagrid-row-r4-2-1" datagrid-row-index="1" class="datagrid-row">
         <td field="PLANT_CODE" style="display:none;">
            <div style="text-align: left;" class="datagrid-cell datagrid-cell-c4-PLANT_CODE">1001</div>
         </td>
         <td field="PLANT_NM">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-PLANT_NM">BOCAR LERMA</div>
         </td>
         <td field="PU_NAME" style="display:none;">
            <div style=";text-align:left;" class="datagrid-cell datagrid-cell-c4-PU_NAME"></div>
         </td>
         <td field="SUPPLIER_CODE">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-SUPPLIER_CODE">SUP001AR</div>
         </td>
         <td field="SUPPLIER_NM">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-SUPPLIER_NM">SUPPLIER 001 AR</div>
         </td>
         <td field="ITEM_CODE">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-ITEM_CODE">ITEM001AR</div>
         </td>
         <td field="ITEM_NM">
            <div style=";text-align:left;" class="datagrid-cell datagrid-cell-c4-ITEM_NM">ITEM1 AR</div>
         </td>
         <td field="WRHOUSNG_NO" style="display:none;">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-WRHOUSNG_NO">PUR1</div>
         </td>
         <td field="ORDE_NO" style="display:none;">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-ORDE_NO">PUR1</div>
         </td>
      </tr>    </tbody> </table>
String cell = cols.get(indexCol).getText();
List<WebElement> cols = rows.get(0).findElements(By.tagName("td"));
String cell = cols.get(0).getText();
System.out.println("cell value :" +cell);
List cols=rows.get(0).findElements(按.tagName(“td”));
String cell=cols.get(0.getText();
System.out.println(“单元格值:“+单元格”);
或者对“选择所有单元格”表尝试此迭代:

for(int i=0; i<rows.size(); i++) {
    //check column each in row, identification with 'td' tag
    List<WebElement> cols = rows.get(i).findElements(By.tagName("td"));

    //column iteration
    for(int j=0; j<cols.size(); j++) {
        System.out.println("row " +(i+1) +" col " +(j+1) +" : " +cols.get(j).getText());
    }
}

for(int i=0;i尝试此步骤以获得所需的结果

1.表格初始化

在您的情况下,该表具有类
datagrid btable
,初始化它的方法是:

WebElement tbl = driver.findElement(By.className("datagrid-btable"));
List<WebElement> rows = tbl.findElements(By.tagName("tr"));
2.行初始化

web表行的名称标记通常是
tr
,初始化它的方法是:

WebElement tbl = driver.findElement(By.className("datagrid-btable"));
List<WebElement> rows = tbl.findElements(By.tagName("tr"));
3.列初始化

web表列的名称标记通常为
th
td
,初始化方式如下:

WebElement tbl = driver.findElement(By.className("datagrid-btable"));
List<WebElement> rows = tbl.findElements(By.tagName("tr"));
td
tag

List<WebElement> cols = rows.get(rowIndex).findElements(By.tagName("td"));
row1
中选择
col1
的示例:

<table class="datagrid-btable" cellspacing="0" cellpadding="0" border="0" style="table-layout: auto;">    <tbody>
      <tr id="datagrid-row-r4-2-0" datagrid-row-index="0" class="datagrid-row datagrid-row-selected">
         <td field="PLANT_CODE" style="display:none;">
            <div style="text-align: left;" class="datagrid-cell datagrid-cell-c4-PLANT_CODE">1001</div>
         </td>
         <td field="PLANT_NM">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-PLANT_NM">TESTE1</div>
         </td>
         <td field="PU_NAME" style="display:none;">
            <div style=";text-align:left;" class="datagrid-cell datagrid-cell-c4-PU_NAME"></div>
         </td>
         <td field="SUPPLIER_CODE">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-SUPPLIER_CODE">SUP001AR</div>
         </td>
         <td field="SUPPLIER_NM">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-SUPPLIER_NM">SUPPLIER 001 AR</div>
         </td>
         <td field="ITEM_CODE">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-ITEM_CODE">ITEM001AR</div>
         </td>
         <td field="ITEM_NM">
            <div style=";text-align:left;" class="datagrid-cell datagrid-cell-c4-ITEM_NM">ITEM1 AR</div>
         </td>
         <td field="WRHOUSNG_NO" style="display:none;">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-WRHOUSNG_NO"></div>
         </td>
         <td field="ORDE_NO" style="display:none;">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-ORDE_NO"></div>
         </td>
      </tr>
      <tr id="datagrid-row-r4-2-1" datagrid-row-index="1" class="datagrid-row">
         <td field="PLANT_CODE" style="display:none;">
            <div style="text-align: left;" class="datagrid-cell datagrid-cell-c4-PLANT_CODE">1001</div>
         </td>
         <td field="PLANT_NM">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-PLANT_NM">BOCAR LERMA</div>
         </td>
         <td field="PU_NAME" style="display:none;">
            <div style=";text-align:left;" class="datagrid-cell datagrid-cell-c4-PU_NAME"></div>
         </td>
         <td field="SUPPLIER_CODE">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-SUPPLIER_CODE">SUP001AR</div>
         </td>
         <td field="SUPPLIER_NM">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-SUPPLIER_NM">SUPPLIER 001 AR</div>
         </td>
         <td field="ITEM_CODE">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-ITEM_CODE">ITEM001AR</div>
         </td>
         <td field="ITEM_NM">
            <div style=";text-align:left;" class="datagrid-cell datagrid-cell-c4-ITEM_NM">ITEM1 AR</div>
         </td>
         <td field="WRHOUSNG_NO" style="display:none;">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-WRHOUSNG_NO">PUR1</div>
         </td>
         <td field="ORDE_NO" style="display:none;">
            <div style=";text-align:center;" class="datagrid-cell datagrid-cell-c4-ORDE_NO">PUR1</div>
         </td>
      </tr>    </tbody> </table>
String cell = cols.get(indexCol).getText();
List<WebElement> cols = rows.get(0).findElements(By.tagName("td"));
String cell = cols.get(0).getText();
System.out.println("cell value :" +cell);
List cols=rows.get(0).findElements(按.tagName(“td”));
String cell=cols.get(0.getText();
System.out.println(“单元格值:“+单元格”);
或者对“选择所有单元格”表尝试此迭代:

for(int i=0; i<rows.size(); i++) {
    //check column each in row, identification with 'td' tag
    List<WebElement> cols = rows.get(i).findElements(By.tagName("td"));

    //column iteration
    for(int j=0; j<cols.size(); j++) {
        System.out.println("row " +(i+1) +" col " +(j+1) +" : " +cols.get(j).getText());
    }
}

for(inti=0;iHi-cleici,您尝试了什么?您在哪里遇到了问题?请查看属性
datagrid row index=“0”
逐渐增加它,并且在每一行中都有一组特定的列,它们看起来是staticHi@mrfreester:)首先,我尝试使用id/xpath选择第一行,以了解表中是否有结果,但我发现id是动态的,因此我无法以这种方式映射元素。因此我尝试了“我的代码”,但无法正常工作!您关心得到哪一行吗?您可能只需执行
“(//*[@class='datagrid-body']/tbody/tr)[1]”
如果您想获取第一个。或者使用
findElements
从列表中获取第一个。如果您想获取一个特定的,答案会更复杂。嗨,Cleice,您尝试了什么?您遇到了什么问题?查看属性
datagrid row index=“0”
逐渐递增,在每一行中都有一组特定的列,似乎是staticHi@mrfreester:)首先,我尝试使用id/xpath选择第一行,以了解表中是否有结果,但我发现id是动态的,因此无法以这种方式映射元素。因此我尝试了“我的代码”,但不是有效的牙床!你在乎你得到哪一行吗?你可能只需要做
“(//*[@class='datagrid-body']/tbody/tr)[1]”
如果您想获取第一个。或者使用
findElements
从列表中获取第一个。如果您想获取具体的答案,答案会更复杂。@CleicyGuiãoWelcome@CleicyGui欢迎光临