seleniumwebdriver:基于多行值查找复选框

lf5gs5x2  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(300)

我浏览了这个网站,但找不到解决问题的方法,我想知道是否有更多的 selenium 经验的人可以帮助我。很抱歉发了这么长的帖子,但我想确保我把事情解释清楚了。
我在用java。我通常使用rationalfunctiontester(java),但是我试图看看是否可以重写一些测试的代码,看看转换起来有多容易。
我有一个包含11列和4行的表(但它可以是20行或50行,在测试期间会有波动)。我可以读取表及其内容以找到所需的行。我比较前10个单元格值中的每一个,如果它们都匹配,我想单击第11列中的复选框。否则,继续下一行。
该函数可以正确地从每个单元格中检索值。但是,当我尝试单击复选框时,它总是选择第一行的复选框。当我选中属性时,我可以看到所有的复选框都有相同的“name”,但是值不同(比如1330361、1330363、1330359等等)。有趣的是,如果我搜索行中的所有复选框,它会报告其中的4个(在整个表中找到的数字,而不是在行中)。
我可能犯了一个非常基本的错误,但我不知道是什么。
我使用以下代码在表中搜索。函数接收表行,此时,我只是报告单元格值,然后尝试单击行中的复选框。这是一种调试功能。我不确定发布大量代码是否合适,所以我将只放一个简短的版本,在那里我尝试单击表中的每个复选框。

// Passing a specific table row to the function:
List<WebElement> columns=myRow.findElements(By.tagName("td"));
for (int iLoop = 0;iLoop < columns.size();iLoop++)
{
     System.out.println("Column " + iLoop + " : '" + columns.get(iLoop).getText().toString() + "'");
     // code to compare actual and expected values and setting of a boolean variable.

     if (iLoop == 10 && recordMatch)
     {
          tCheckbox = myRow.findElement(By.xpath("//input[@type='checkbox']"));
         System.out.println("Value is :" + tCheckbox.getAttribute("value").toString());
          tCheckbox.click();
     }
efzxgjgh

efzxgjgh1#

获取复选框的xpath将整个页面作为作用域。我将在前面添加一个点,以获得相对于元素的范围:

// Passing a specific table row to the function:
List<WebElement> columns=myRow.findElements(By.tagName("td"));
for (int iLoop = 0;iLoop < columns.size();iLoop++)
{
  System.out.println("Column " + iLoop + " : '" + columns.get(iLoop).getText().toString() + "'");
  // code to compare actual and expected values and setting of a boolean variable.

  if (iLoop == 10 && recordMatch)
  {
    tCheckbox = myRow.findElement(By.xpath(".//input[@type='checkbox']"));
    System.out.println("Value is :" + tCheckbox.getAttribute("value").toString());
    tCheckbox.click();
  }
}

但更好的方法是在迭代列之前收集所有复选框:

// Passing a specific table row to the function:
List<WebElement> columns=myRow.findElements(By.xpath("//td[.//input[@type='checkbox']]"));
List<WebElement> checkboxes=myRow.findElements(By.xpath("//td//input[@type='checkbox']"));
for (int iLoop = 0;iLoop < columns.size();iLoop++)
{
  System.out.println("Column " + iLoop + " : '" + columns.get(iLoop).getText().toString() + "'");
  // code to compare actual and expected values and setting of a boolean variable.

  if (iLoop == 10 && recordMatch)
  {
    tCheckbox = checkboxes.get(iLoop);
    System.out.println("Value is :" + tCheckbox.getAttribute("value").toString());
    tCheckbox.click();
  }
}
nkkqxpd9

nkkqxpd92#

如果要单击基于值的复选框,则必须使用for循环和复选框absolute xpath列出所有值并传递“i”值,请参见下面的代码:

WebElement table = driver.findElement(By.xpath("//div[@id ='content']/table"));
        /*List <WebElement> head = driver.findElements(By.tagName("th"));
        head.size();

        for (int h=0;h<head.size();h++){*/
        List <WebElement> row = driver.findElements(By.tagName("tr"));
        row.size();

        for (int i=0;i<row.size();i++){

            List <WebElement> col = row.get(i).findElements(By.tagName("td"));
            col.size();

            for (int j=0;j<col.size();j++){
                String cv = col.get(j).getText();
// If name is Saudi Arabia, it will click on check box 
                if(cv.equalsIgnoreCase("Saudi Arabia")){
// Divide the x path where colunm is changing html/body/div[1]/div[5]/div[2]/div/div/table/tbody/tr[pass i value]/td[6]";
                    String xp1 = "html/body/div[1]/div[5]/div[2]/div/div/table/tbody/tr[";
                    String xp2 = "]/td[6]";

// Pass the i value xp1+i+xp2
                    driver.findElement(By.xpath(xp1+i+xp2)).click();
                }
                System.out.println(cv);
            }

        }

相关问题