首页 > 解决方案 > 如何在分页的 web 表格中找到所需的值?

问题描述

该页面有一个分页的 webtable。我想浏览表格并检查是否不存在带有来自参数的文本的单元格 - 单击下一步按钮并再次检查

我试着写这样的东西。我编写了遍历行列表并从每行指定列下的单元格中获取文本的方法

protected GroupTableContainerComponent getContainerComponentByName(String groupCode) {
    GroupTableContainerComponent result = null;
    List<GroupTableContainerComponent> rows = getContainerComponents();
    Iterator<GroupTableContainerComponent> i = rows.iterator();
    while (i.hasNext()) {
        GroupTableContainerComponent current = i.next();

        if (!current.getGroupCodeText().toLowerCase().equals(groupCode.toLowerCase())) {
            clickNextButton();

            List<GroupTableContainerComponent> rows2 = getContainerComponents();
            Iterator<GroupTableContainerComponent> j = rows2.iterator();
            while (j.hasNext()){
                GroupTableContainerComponent current2 = j.next();
                if (current2.getGroupCodeText().toLowerCase().equals(groupCode.toLowerCase())){

                }
            }
        }
        result = current;
        break;
    }
    if (result == null) {
        throw new RuntimeException(String.format("Group with groupCode: %s not found", groupCode));
    }
    return result;
}

但是在单击下一步按钮后,我收到错误StaleElementReferenceException

我认为这是因为我的行列表包含上一页表中的旧行

这是我的 getContainerComponent()

public List<GroupTableContainerComponent> getContainerComponents() {
    containerComponents = new ArrayList<>();

    for (WebElement current : driver.findElements(By.xpath(groupTableContainerXpath))) {
        containerComponents.add(new GroupTableContainerComponent(current));
    }
    return containerComponents;
}

和 Xpath

private final String groupTableContainerXpath = "//div[@class='table-container']/table/tbody/tr";

还有我的 getGroupCodeText()

public WebElement getGroupCode() {
    WebElement groupsCode = groupTableComponent.findElement(groupCode);
    return groupsCode;
}

public String getGroupCodeText() {
    return getGroupCode().getText();
}

和 Xpath

private  By groupCode = By.xpath(".//td[contains(@class,'cdk-column-group_name')]");

标签: javaseleniumselenium-webdriver

解决方案


我做到了,我决定在我的方法中创建列表。首先,我检查表的第一页中是否存在带有来自参数的文本的单元格,如果单元格不存在,我检查我的分页下一个按钮的状态,当它启用时,我点击它并等待第一个列表将是不可见的并且然后创建新列表并分配新值

protected GroupTableContainerComponent getContainerComponentByName(String groupCode) {
        GroupTableContainerComponent result = null;
        WebDriverWait waits = new WebDriverWait(driver, 10);
        List<WebElement> rows = driver.findElements(By.xpath(groupTableContainerXpath));
        List<GroupTableContainerComponent> containerComponents = new ArrayList<>();
        for (WebElement current : rows) {
            containerComponents.add(new GroupTableContainerComponent(current));
        }
        for (GroupTableContainerComponent current : containerComponents) {
            System.out.println(current.getGroupCodeText());
            if (current.getGroupCodeText().toLowerCase().equals(groupCode.toLowerCase())) {
                result = current;
                break;
            }

        }
        if (result == null){

            boolean isEnabled = isNextArrowEnabled();
            while (isEnabled) {
                clickNextButton();
                waits.until(ExpectedConditions.invisibilityOfAllElements(rows));
                List<WebElement> rows2 = waits.until(ExpectedConditions.visibilityOfAllElements(driver.findElements(By.xpath(groupTableContainerXpath))));
                List<GroupTableContainerComponent> containerComponents2 = new ArrayList<>();
                for (WebElement current2 : rows2) {
                    containerComponents2.add(new GroupTableContainerComponent(current2));

                }
                for (GroupTableContainerComponent current3 : containerComponents2) {
                    System.out.println(current3.getGroupCodeText());
                    if (current3.getGroupCodeText().toLowerCase().equals(groupCode.toLowerCase())) {
                        result = current3;
                        break;
                    }
                }

                if (result == null) {
                    if (isNextArrowEnabled()) isEnabled = true;
                    else isEnabled = false;
                } else return result;
            }
        }

            if (result == null) {
                throw new RuntimeException(String.format("Group with groupCode: %s not found", groupCode));
            }

        return result;

推荐阅读