web-dev-qa-db-ja.com

要素の属性を変更するためのWebDriverWait

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を期待しているので、それは明らかに機能しませんが、私が評価しようとしているものです。何か案は?

20

以下は、要件に役立つ場合があります。次のコードでは、探している条件を組み込んだapplyメソッドをオーバーライドしています。したがって、条件がtrueでない限り、この例ではenabledがtrueでないため、applyメソッドがtrueを返すまで、500ミリ秒ごとにポーリングし(これがデフォルトです)、最大10秒間ループします。

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;
    }
});
32
Sridevi Yedidha

誰かが@SriをSeleniumラッパーのメソッドとして使用したい場合、これを行う方法があります( this answer btwに感謝します)。

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));
}
1
Arthur

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)))
1
Miro

これは、単純なdo-whileループSystem.currentTimeMillis();を使用して行うこともできます。メソッドは、無限ループを回避するために使用できます

long startTime = System.currentTimeMillis();
String disabled;
do{
   disabled = element.getAttribute("attributeName").trim();
}while(disabled!="false" && System.currentTimeMillis()-startTime<10000);
0
Faisal Uddin

これは、かなり遅いbootstrapページがソートボタンが有効になるのを待っているときに、ページを自動化するときに有効でした。

    new WebDriverWait(webDriver, 10)
.until(ExpectedConditions.attributeContains(BUTTON_SORT_ASCENDING_PRICE, "class", "sortButtonActive"));
  • "webDriver"-WebDriverの現在のインスタンス
  • "10"-タイムアウト秒
  • "BUTTON_SORT_ASCENDING_PRICE"-要素のByロケーター
  • "class"-属性
  • "sortButtonActive"-私が待っている 'class'の値

セレンV3.01

0
Ronald_Bulkins