单击每个元素并执行操作时出现问题

时间:2019-01-15 06:00:40

标签: java selenium selenium-webdriver

我有一个包含多行的Web表。我想创建一个循环,使其遍历此表的所有行,然后单击第一行的第1列元素,然后检查内部是否存在“编辑”按钮。然后返回并单击下一个元素,然后检查编辑按钮。然后返回并重复直到遍历所有行。

但是在我执行的当前代码中,它只是遍历第一行然后退出。有人可以帮我吗?

    viewDiscussionScope(driver, scope);
    WebElement paginationLabel = WaitUtils.waitForElement(driver, By.cssSelector(".v-csslayout-cvr-c-pagination__header"));
    if(paginationLabel.isDisplayed())
    {
        WebElement table = WaitUtils.waitForElement(driver, By.cssSelector("table.eds-o-table.cvr-c-table--list tbody"));
        List<WebElement> rows = table.findElements(By.cssSelector("tr.eds-o-table__row"));
        for(WebElement row: rows)
            {
                List<WebElement> tableCols = row.findElements(By.cssSelector("td.eds-o-table__cell:nth-of-type(1)"));
                for(WebElement col : tableCols)
                {
                    col.findElement(By.cssSelector(".v-label-eds-c-text--bold")).click();
                    WebElement messageField = WaitUtils.waitForElement(driver, By.cssSelector(".eds-o-media__body-eds-o-media__body--top .v-label-eds-u-flexitext.v-label-undef-w:nth-of-type(1)"));
                    String messageText = messageField.getText();
                    boolean editLabel = (driver.findElement(By.cssSelector(".eds-c-button-set-eds-c-button-set--align-right .v-button-eds-s-is-first")).getText()).equals("Edit");
                    if(!(editLabel))
                    {
                        LOG.info(messageText+" is not editable by the logged in user");                         
                    }
                    else
                    {
                        LOG.info(messageText+" is editable by the logged in user");                         
                    }
                    break;
                }
                break;
            }           
    }
}

4 个答案:

答案 0 :(得分:0)

从父break循环中删除for语句!

for(WebElement row: rows)
{
            List<WebElement> tableCols = row.findElements(By.cssSelector("td.eds-o-table__cell:nth-of-type(1)"));
            for(WebElement col : tableCols)
            {
               // your code
            }

          // REMOVE => break;
        }           
}

答案 1 :(得分:0)

您有2个break需要删除,如果只想单击第一个td

,则不需要遍历td

if (paginationLabel.isDisplayed())
{
    WebElement table = WaitUtils.waitForElement(driver, By.cssSelector("table.eds-o-table.cvr-c-table--list tbody"));
    List<WebElement> rows = table.findElements(By.cssSelector("tr.eds-o-table__row"));
    for (WebElement row :  rows)
    {
        // get first td
        WebElement tableCol = row.findElement(By.cssSelector("td.eds-o-table__cell:nth-of-type(1)"));
        tableCol.findElement(By.cssSelector(".v-label-eds-c-text--bold")).click();
        WebElement messageField = WaitUtils.waitForElement(driver, By.cssSelector(".eds-o-media__body-eds-o-media__body--top .v-label-eds-u-flexitext.v-label-undef-w:nth-of-type(1)"));
        String messageText = messageField.getText();
        boolean editLabel = (driver.findElement(By.cssSelector(".eds-c-button-set-eds-c-button-set--align-right .v-button-eds-s-is-first")).getText()).equals("Edit");
        if (!(editLabel))
        {
            LOG.info(messageText + " is not editable by the logged in user");
        }
        else
        {
            LOG.info(messageText + " is editable by the logged in user");
        }
    }
}

答案 2 :(得分:0)

首先,您需要找到位于表中的编辑按钮的位置,可以找到其xpath,如果所有编辑按钮具有相同的xpath,如果是,那么您的问题将得到解决,只需通过findElements()方法进行查找并存储将其放入List并获取编辑按钮的值或检查是否可用,可以调用.get()方法,该方法将获取相同xpath的所有受关注按钮,并将索引指定为.get(0),. get(1 )或将其循环传递,您可以通过.getText()方法获取他的值并对其进行检查或执行操作

答案 3 :(得分:0)

如果您可以提供要使用的表的DOM,我可以为您提供更好的帮助。

如果我正确理解了您的问题,这也是解决方案,那么我强烈建议对小任务使用方法,从长远来看将对您有帮助。同样,选择器需要更好的包装,显式等待也需要使用自己的方法进行包装。

尝试一下:

 if (paginationLabel.isDisplayed())
{
    WebElement table = WaitUtils.waitForElement(driver, By.cssSelector("table.eds-o-table.cvr-c-table--list tbody"));
    List<WebElement> rows = table.findElements(By.cssSelector("tr.eds-o-table__row"));
    for (int i=1; i<=rows.size; i++)
    {

        // get first td

       clickColumn(int i);
       getMessageText(int i);
        boolean editLabel = (driver.findElement(By.cssSelector(".eds-c-button-set-eds-c-button-set--align-right .v-button-eds-s-is-first")).getText()).equals("Edit");
        if (!(editLabel))
        {
            LOG.info(messageText + " is not editable by the logged in user");
        }
        else
        {
            LOG.info(messageText + " is editable by the logged in user");
        }
    }
}

private clickColumn(int position) {
 WebElement tableCol = row.findElement(By.cssSelector("td.eds-o-table__cell:nth-of-type(" + position + ")"));
            tableCol.findElement(By.cssSelector(".v-label-eds-c-text--bold")).click();
}

private getMessageText(int position) {
WebElement messageField = WaitUtils.waitForElement(driver, By.cssSelector(".eds-o-media__body-eds-o-media__body--top .v-label-eds-u-flexitext.v-label-undef-w:nth-of-type(" + position + ")"));
            String messageText = messageField.getText();
}