java - Selenium - 展开元素不起作用,而折叠元素则起作用

标签 java selenium

我正在编写一个测试来展开和折叠页面上的某些可折叠元素。网址:https://blackrockdigital.github.io/startbootstrap-sb-admin-2/pages/panels-wells.html

我的页面对象中有此代码:

@FindBy(xpath = "//*[contains(@id,'accordion')]")
List<WebElement> collapsibleItems;

@FindBy(xpath = "//*[contains(@id,'collapse')]")
List<WebElement> collapsibleTexts;

public boolean checkIfElementIsExpanded(String value) {
    for (WebElement collapsibleText:collapsibleTexts) {
        return collapsibleText.findElement(By.xpath("//*[@id='collapse" + value + "\']/div")).isDisplayed();
    }
    return false;
}

public void collapseAnItem(String value, int number) {
    for (WebElement collapsibleItem : collapsibleItems) {
        if(checkIfElementIsExpanded(value)==true) {
            collapsibleItem.findElement(By.xpath(("//*[@id='accordion']/div[" + number + "]/div[1]/h4/a"))).click();
        }       
    }
}

public void expandAnItem(String value, int number) {
    for (WebElement collapsibleItem : collapsibleItems) {
        if(checkIfElementIsExpanded(value)==false) {
            collapsibleItem.findElement(By.xpath(("//*[@id='accordion']/div[" + number + "]/div[1]/h4/a"))).click();
        }       
    }
}

当我想要折叠一个元素时,一切正常。但是,当我尝试扩展一个元素时,它不会执行任何操作 - 没有异常(exception),但代码不会执行。我究竟做错了什么?请帮助我。

最佳答案

尽管可以对您的代码进行很多改进,但如果您添加一些等待,它仍然可以工作。您有此展开和折叠动画,因此您需要添加一些等待元素在展开和折叠后变得可见或不可见。 我重新创建了您的代码并在 chrome 中运行它并等待,我能够先折叠并展开第三项,无需任何更改。

此外,这里还有一些改进代码的建议。 1 - 不要使用 PageFactory,它没有提供任何好处。如果您希望代码看起来更简洁,请将定位器保存在 By 元素中。

2 - 你不需要这些循环。由于您指定了要使用的元素编号,因此可以直接获取它。没有循环。

3 - if 语句中不需要 ==true 或 ==false

4 - 字符串值和整数基本上完成相同的工作,因此您可以删除其中一个。

下面是改进的代码,可以满足您的需要:

    public boolean checkIfElementIsExpanded(int number) {
        WebElement textElement = driver.findElement(By.xpath(("//*[@id='accordion']/div[" + number + "]/div[2]")));
        return textElement.isDisplayed();
    }


    public void collapseAnItem(int number) {
        WebElement itemHeader = driver.findElement(By.xpath(("//*[@id='accordion']/div[" + number + "]/div[1]/h4/a")));
        if (checkIfElementIsExpanded(number)) {
            itemHeader.click();
        }

        // Since you collapsing item, text will become invisible, so we need to wait for invisibility
        WebElement textElement = driver.findElement(By.xpath(("//*[@id='accordion']/div[" + number + "]/div[2]")));
        WebDriverWait wait = new WebDriverWait(driver, 3);
        wait.until(ExpectedConditions.invisibilityOf(textElement));
    }


    public void expandAnItem(int number) {
        WebElement itemHeader = driver.findElement(By.xpath(("//*[@id='accordion']/div[" + number + "]/div[1]/h4/a")));
        if (!checkIfElementIsExpanded(number)) {
            itemHeader.click();
        }

        // Since you collapsing item, text will become visible, so we need to wait for visibility
        WebElement textElement = driver.findElement(By.xpath(("//*[@id='accordion']/div[" + number + "]/div[2]")));
        WebDriverWait wait = new WebDriverWait(driver, 3);
        wait.until(ExpectedConditions.visibilityOf(textElement));
    }

对于您的测试,我添加了打印内容,以便您可以看到结果:

System.out.println("Is element number 1 expanded: " + panelsAndWellsPage.checkIfElementIsExpanded(1));
panelsAndWellsPage.collapseAnItem(1);
System.out.println("Is element number 1 expanded: " + panelsAndWellsPage.checkIfElementIsExpanded(1));

System.out.println("Is element number 3 expanded: " + panelsAndWellsPage.checkIfElementIsExpanded(3));
panelsAndWellsPage.expandAnItem(3);
System.out.println("Is element number 3 expanded: " + panelsAndWellsPage.checkIfElementIsExpanded(3));

关于java - Selenium - 展开元素不起作用,而折叠元素则起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53542159/

相关文章:

java - 使用变量 String 或 char 作为对象名称

javascript - python selenium xpath 多个按钮使用 javascript 问题

python selenium xpath 错误 [object XrayWrapper [object Attr]]

python - 如何在 selenium 中全屏显示(ChromeDriver)

selenium - 从无限滚动网站抓取内容

java - 写这个 IP 阀的正确方法是什么?

c# - asp.net 中的内容而不是 java 中的 httpsessionlistener

java - 通过构造函数将上下文从主 Activity 传递到 Java 类时获取 "this field leaks a context object"

java - 从 RESTClient 获取的结果中解析具体数据

java - 有没有办法在 spring boot 中验证@Value?