22

如何使用 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 而不是字符串,但这是我想要评估的。有任何想法吗?

4

5 回答 5

36

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

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;
    }
});
于 2013-03-06T02:36:36.653 回答
2

如果有人想在 Selenium 包装器中使用 @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));
}
于 2014-05-20T14:03:29.927 回答
1

您可以使用 xpath 来定义具有所需值的属性的元素,然后等待它出现在页面上。在 Python 中,它可能如下所示:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC    

xp = '//*[@id="element_id"][@aria-disabled="false"]'
WebDriverWait(browser, 60).until(EC.presence_of_element_located((By.XPATH, xp)))
于 2018-07-26T09:01:41.253 回答
0

当针对等待排序按钮生效的非常慢的引导页面进行自动化时,这对我有用。

    new WebDriverWait(webDriver, 10)
.until(ExpectedConditions.attributeContains(BUTTON_SORT_ASCENDING_PRICE, "class", "sortButtonActive"));
  • “webDriver” - 我当前的 WebDriver 实例
  • "10" - 超时秒数
  • "BUTTON_SORT_ASCENDING_PRICE" - 元素的 By 定位器
  • “类” - 属性
  • "sortButtonActive" - 我正在等待的 'class' 的值

硒 V3.01

于 2017-01-20T15:55:07.637 回答
0

也可以使用简单的 do-while 循环 System.currentTimeMillis(); 来完成。方法可用于避免无限循环

long startTime = System.currentTimeMillis();
String disabled;
do{
   disabled = element.getAttribute("attributeName").trim();
}while(disabled!="false" && System.currentTimeMillis()-startTime<10000);
于 2017-08-01T05:12:38.457 回答