WebDriver等待元素属性更改

如何使用 WebDriverWait 等待属性更改?

在我的AUT中,我必须等待按钮启用才能继续,不幸的是,由于开发人员编码页面的方式,我无法使用WebElement的isEnabled()方法。开发人员正在使用一些CSS来使按钮看起来像是被禁用的,因此用户无法单击它,并且方法isenabled对我来说总是返回true。因此,我所要做的是获取属性“aria-disabled”,并检查文本是“true”还是“false”。到目前为止,我一直在做的是使用Thread.sleep进行for循环,如下所示:

for(int i=0; i<6; ++i){
    WebElement button = driver.findElement(By.xpath("xpath"));
    String enabled = button.getText()
    if(enabled.equals("true")){ break; }
    Thread.sleep(10000);
 }

(如果不正确,请忽略上面的代码,只是我正在做的伪代码)

我相信有一种方法可以使用WebDriverWait实现类似的东西,这是我不知道如何实现的首选方法。这就是我试图实现的目标,即使以下方法不起作用:

WebDriverWait wait = new WebDriverWait(driver, 60);
wait.until(ExpectedConditions.visibilityOf(refresh.getText() == "true")); 

显然它不起作用,因为该函数期望的是WebElement而不是String,但这是我试图评估的。有什么想法吗?


答案 1

以下内容可能会对您的要求有所帮助。在下面的代码中,我们将重写 apply 方法,其中包含我们正在寻找的条件。因此,只要条件不为真,在我们的例子中,启用的不为真,我们进入一个循环,最多10秒,每500毫秒轮询一次(这是默认值),直到appere方法返回true。

WebDriverWait wait = new WebDriverWait(driver,10);

wait.until(new ExpectedCondition<Boolean>() {
    public Boolean apply(WebDriver driver) {
        WebElement button = driver.findElement(By.xpath("xpath"));
        String enabled = button.getAttribute("aria-disabled");
        if(enabled.equals("true")) 
            return true;
        else
            return false;
    }
});

答案 2

如果有人想在硒包装器中使用@Sri作为方法,这里有一种方法可以做到这一点(顺便说一句,这要归功于这个答案):

public void waitForAttributeChanged(By locator, String attr, String initialValue) {
    WebDriverWait wait = new WebDriverWait(this.driver, 5);

    wait.until(new ExpectedCondition<Boolean>() {           
        private By locator;
        private String attr;
        private String initialValue;

        private ExpectedCondition<Boolean> init( By locator, String attr, String initialValue ) {
            this.locator = locator;
            this.attr = attr;
            this.initialValue = initialValue;
            return this;
        }

        public Boolean apply(WebDriver driver) {
            WebElement button = driver.findElement(this.locator);
            String enabled = button.getAttribute(this.attr);
            if(enabled.equals(this.initialValue)) 
                return false;
            else
                return true;
        }
    }.init(locator, attr, initialValue));
}

推荐