ExpectConditions.or 函数无法按预期工作



我必须测试一个电子商店。用户可以将商品添加到购物车。 当购物车为空时,将创建一个 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));

这确保了两个部分之一的存在。

您可以做两件事来清理它:

  1. 创建与两个元素匹配的 CSS 选择器
  2. 使用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_videconteneur_panier_non_vide属性导致 Selenium 尝试获取它们。您只需要等待任一元素的出现。

你实例化了你的等待对象吗?您没有指定您的环境,但这是我所做的

C#var wait = new WebDriverWait( Driver, TimeSpan.FromSeconds( 10 ) );

爪哇WebDriverWait wait = new WebDriverWait(driver, 20);

我确实解决了这个问题,并编辑了这个问题让人们知道。

TL;博士: 在调用or函数之前,我需要一些延迟,并通过等待 URL 是正确的来做到这一点。

相关内容

  • 没有找到相关文章

最新更新