我必须测试一家电子商店。用户可以将商品添加到他们的购物车。 当购物车为空时,将创建一个 ID 为“empty-basket”的特殊部分。如果购物车不为空,则此部分的 id 变为“篮子”。
我使用 Java 和 Selenium 3.9
这是我的两个选择器
@FindBy(how = How.CSS, using = "#empty-basket > section")
private WebElement conteneur_panier_vide;
@FindBy(how = How.CSS, using = "#basket > section:nth-child(1)")
private WebElement conteneur_panier_non_vide;
为了检查包含元素的 block 是否格式正确,我检查是否存在上述部分之一。我使用这段代码来这样做:
this.wait.until(
ExpectedConditions.or(
ExpectedConditions.visibilityOf(conteneur_panier_vide),
ExpectedConditions.visibilityOf(conteneur_panier_non_vide)
)
);
但是,这给了我一个错误
org.openqa.selenium.TimeoutException: Expected condition failed: waiting for at least one condition to be valid
很惊讶,我试过这个:
this.wait.until(ExpectedConditions.visibilityOf(conteneur_panier_vide))
在一个空篮子的页面上。它有效,找到了 WebElement。
然后我尝试了这个:
this.wait.until(
ExpectedConditions.or(
ExpectedConditions.visibilityOf(conteneur_panier_vide),
)
);
而且效果也很好。这意味着向“或”添加一个不存在的元素会破坏它,这与它应该是的完全相反。
有谁知道为什么我的代码不起作用?
编辑:已解决!
问题是调用或
函数时,我要查找的元素不在页面上,导致上述故障。
简单的说
this.wait.until(ExpectedConditions.urlContains(MY_CART_URL));
这确保了两个部分之一的存在。
最佳答案
你可以做两件事来清理它:
- 创建一个匹配这两个元素的 CSS 选择器
- 使用
ExpectedConditions.visibilityOfElementLocated(By.css(...))
而不是更复杂的或
// CSS selectors can be separated by a comma (,)
String cssSelector = "#empty-basket > section, #basket > section:nth-child(1)";
this.wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(cssSelector));
您最初的问题是使用 conteneur_panier_vide
和 conteneur_panier_non_vide
属性导致 Selenium 尝试获取它们。您只需要等待任一元素的出现即可。
关于java - ExpectedConditions.or 函数未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58013711/