搜索后无法检查可见的网页元素

时间:2018-01-30 15:28:52

标签: java reactjs selenium

我的功能文件中有一个场景,它只是打开一个给定的页面,搜索一个员工并检查所述员工是否存在。但是,我无法弄清楚一个陈旧的元素引用,它一直在嘲弄我。

我已经整合了一些通用的等待方法来检查可见性并验证元素的存在,但无济于事。

这是我的BasePage类的片段:

  public void waitForElementToBeClickable(WebElement element) {
    wait.ignoring(NoSuchElementException.class, StaleElementReferenceException.class)
        .pollingEvery(2, TimeUnit.SECONDS)
        .until(ExpectedConditions.elementToBeClickable(element));
}

public void waitForElementToBeVisible(WebElement element) {
    wait.ignoring(NoSuchElementException.class, StaleElementReferenceException.class)
        .pollingEvery(2, TimeUnit.SECONDS)
        .until(ExpectedConditions.visibilityOf(element));
}

public void verifyPresenceOfElement(WebElement element) {
    boolean presence = false;
    int attempts = 0;

    while (attempts < 5) {
        try {
            if (element.isDisplayed()) {
                presence = true;
                break;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        attempts++;
    }
}

前两种方法只是Selenium的WebDriverWait类的包装器。第三个重试以检查元素是否显示。

在我的页面对象类中,我有一个循环遍历web元素列表的方法,并检查文本是否包含与参数匹配的字符串。像这样:

public boolean listOfEmployeeCards(String employee) {
    for (WebElement items : employees) {
        if (items.getText().contains(employee)) {
            verifyPresenceOfElement(items);
            return true;
        }
    }
    return false;
}

在我的步骤类中,我在实际测试步骤中执行断言。

在我的页面对象类的第63行抛出异常,它是listOfEmployeeCards中的if语句(如上所述)。我在想我错误地使用了方法verifyPresenceOfElement(),或者整个方法都错了。

我有一个类似的场景,它基本上使用搜索功能在同一页面上过滤员工(通过点击按钮),并且工作得很好。这个场景也使用方法listOfEmployeeCards(),我添加了一个快速打印来检查是否实际上是触发了verifyPresenceOfElement()。它似乎确实被触发了,至少在那种情况下。

快速注意,页面上有一个底层的ReactJS应用程序执行所有操作(搜索,过滤)。

有什么想法吗?哦,如果我不清楚,我很高兴详细说明。

1 个答案:

答案 0 :(得分:0)

我遵循了@RafałLaskowski's指针,最后在我的页面对象类中使用了以下工作代码:

public void searchForEmployee(String text) {
    WebElement results = getDriver().findElement(By.className("fn"));
    if (inputFieldIsEmpty(search)) {
        search.sendKeys(text);
    }
    wait.until(ExpectedConditions.stalenessOf(results));
}

public boolean listOfEmployeeCards(String employee) {
    List<String> employeeList = elementToStringList(employees);
    return elementListContainsString(employeeList, employee);
}