Java ExpectedConditions.或功能未按预期工作

Java ExpectedConditions.或功能未按预期工作,java,selenium,testing,automated-tests,selenium-chromedriver,Java,Selenium,Testing,Automated Tests,Selenium Chromedriver,我必须测试一个电子商店。用户可以将项目添加到购物车中。 当购物车为空时,将创建一个id为“empty basket”的特殊区域。如果购物车不是空的,则该部分的id变为“basket” 我使用Java和Selenium 3.9 这是我的两个选择器 @FindBy(how = How.CSS, using = "#empty-basket > section") private WebElement conteneur_panier_vide; @FindBy(how = How.CSS,

我必须测试一个电子商店。用户可以将项目添加到购物车中。 当购物车为空时,将创建一个id为“empty basket”的特殊区域。如果购物车不是空的,则该部分的id变为“basket”

我使用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;
为了检查包含元素的bloc是否格式良好,我检查是否有上面描述的部分之一。我使用这段代码来实现这一点:

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))
this.wait.until(
    ExpectedConditions.or(
        ExpectedConditions.visibilityOf(conteneur_panier_vide),
    )
);
在一页上有一个空篮子。它工作了,找到了WebElement

然后我试了一下:

this.wait.until(ExpectedConditions.visibilityOf(conteneur_panier_vide))
this.wait.until(
    ExpectedConditions.or(
        ExpectedConditions.visibilityOf(conteneur_panier_vide),
    )
);
而且它也很有效。这意味着向“or”添加一个不存在的元素会破坏它,这与它应该是什么正好相反

有人知道为什么我的代码不起作用吗


编辑:解决了

问题是,调用
函数时,我正在查找的元素不在页面上,导致上述故障

我简单地说

this.wait.until(ExpectedConditions.urlContains(MY_CART_URL));

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

您是否实例化了等待对象?您没有指定您的环境,但以下是我在中所做的

C#
var wait=new-WebDriverWait(驱动程序,TimeSpan.FromSeconds(10))

Java
WebDriverWait wait=newwebdriverwait(驱动程序,20)

您是否实例化了等待对象?您没有指定您的环境,但以下是我在中所做的

C#
var wait=new-WebDriverWait(驱动程序,TimeSpan.FromSeconds(10))

Java
WebDriverWait wait=newwebdriverwait(驱动程序,20)

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

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

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

TL;博士:
在调用
函数之前,我需要一些延迟,并通过等待URL为正确的URL来完成此操作。

您可以做两件事来清理此问题:

  • 创建一个匹配这两个元素的CSS选择器
  • 使用
    ExpectedConditions.visibilityOfElementLocated(By.css(…)
    而不是更复杂的
  • //CSS选择器可以用逗号(,)分隔
    字符串cssSelector=“#空篮子>部分,#篮子>部分:第n个子项(1)”;
    此.wait.until(由.cssSelector(cssSelector))定位的元素的预期条件.可见性);
    

    您最初的问题是,使用
    conteneur\u panier\u vide
    conteneur\u panier\u non\u vide
    属性会导致Selenium尝试获取它们。您只需等待其中一个元素的出现。

    有两种方法可以清除此问题:

  • 创建一个匹配这两个元素的CSS选择器
  • 使用
    ExpectedConditions.visibilityOfElementLocated(By.css(…)
    而不是更复杂的
  • //CSS选择器可以用逗号(,)分隔
    字符串cssSelector=“#空篮子>部分,#篮子>部分:第n个子项(1)”;
    此.wait.until(由.cssSelector(cssSelector))定位的元素的预期条件.可见性);
    

    您最初的问题是,使用
    conteneur\u panier\u vide
    conteneur\u panier\u non\u vide
    属性导致Selenium尝试获取它们。您只需等待其中一个元素的出现。

    您好,是的,我的WebDriverWait对象被实例化,超时10秒。您好,是的,我的WebDriverWait对象是inst设置为10秒超时。
    this.wait.until(ExpectedConditions.visibilityOfElementLocated(By.css(cssSelector));
    应设置为
    this.wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector)(cssSelector)))
    @SzmaKS:Good catch.Fixed!您的方法有效,但有一点输入错误:
    this.wait.until(ExpectedConditions.visibilityOfElementLocated(By.css(cssSelector));
    应该是
    this.wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector));
    @SzmaKS:Good catch.Fixed!