我必须测试一个电子商店。用户可以将商品添加到购物车。 当购物车为空时,将创建一个 ID 为"空篮"的特殊部分。如果购物车不为空,则此部分的 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;
为了检查包含元素的块是否格式正确,我检查是否存在上述部分之一。我使用这段代码来执行此操作:
this.wait.until(
ExpectedConditions.or(
ExpectedConditions.visibilityOf(conteneur_panier_vide),
ExpectedConditions.visibilityOf(conteneur_panier_non_vide)
)
);
但是,这给了我一个错误
org.openqa.selenium.TimeoutException: 预期条件失败: 等待至少一个条件 有效
惊讶,我尝试了这个:
this.wait.until(ExpectedConditions.visibilityOf(conteneur_panier_vide))
在带有空购物篮的页面上。它有效,找到WebElement。
然后我尝试了这个:
this.wait.until(
ExpectedConditions.or(
ExpectedConditions.visibilityOf(conteneur_panier_vide),
)
);
它也很有效。这意味着将不存在的元素添加到"or"会破坏它,这与它应该是什么完全相反。
有没有人知道为什么我的代码不起作用?
编辑:解决了!
问题是调用or
函数时,我正在寻找的元素不在页面上,导致上述故障。
我只是把
this.wait.until(ExpectedConditions.urlContains(MY_CART_URL));
这确保了两个部分之一的存在。
您可以做两件事来清理它:
- 创建与两个元素匹配的 CSS 选择器
- 使用
ExpectedConditions.visibilityOfElementLocated(By.css(...))
而不是更复杂的or
// 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 尝试获取它们。您只需要等待任一元素的出现。
你实例化了你的等待对象吗?您没有指定您的环境,但这是我所做的
C#var wait = new WebDriverWait( Driver, TimeSpan.FromSeconds( 10 ) );
爪哇WebDriverWait wait = new WebDriverWait(driver, 20);
我确实解决了这个问题,并编辑了这个问题让人们知道。
TL;博士: 在调用or
函数之前,我需要一些延迟,并通过等待 URL 是正确的来做到这一点。