我正在编写一个测试来展开和折叠页面上的某些可折叠元素。网址: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/