web-dev-qa-db-de.com

WebDriverWait für ein Elementattribut, das geändert werden soll

Wie kann ich mit WebDriverWait warten, bis sich ein Attribut ändert? 

In meinem AUT muss ich warten, bis eine Schaltfläche aktiviert wird, bevor ich fortfahren kann. Leider hat der Entwickler die Seite codiert. Ich kann die isEnabled () - Methode von WebElement nicht verwenden. Der Entwickler verwendet CSS, um die Schaltfläche so aussehen zu lassen, als wäre sie deaktiviert, sodass der Benutzer nicht darauf klicken kann und die Methode isEnabled für mich immer true zurückgibt. Also muss ich das Attribut "aria-disabled" bekommen und prüfen, ob der Text "true" oder "false" ist. Was ich bisher gemacht habe, ist eine for-Schleife mit Thread.sleep, etwa so:

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

(ignorieren Sie den obigen Code, wenn er falsch ist, nur Pseudo-Code von dem, was ich tue

Ich bin mir sicher, dass es eine Möglichkeit gibt, mit WebDriverWait etwas Ähnliches zu erreichen. Dies ist die bevorzugte Methode, die ich einfach nicht herausfinden kann. Ich versuche dies zu erreichen, auch wenn Folgendes nicht funktioniert:

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

Offensichtlich funktioniert es nicht, weil die Funktion ein WebElement nicht String erwartet, aber ich versuche es auszuwerten. Irgendwelche Ideen? 

14

Die folgenden Informationen können für Ihre Anforderung hilfreich sein: Im folgenden Code überschreiben wir die anwendbare Methode, die die von uns gesuchte Bedingung enthält. Solange die Bedingung nicht wahr ist, ist in unserem Fall die aktivierte Bedingung jedoch nicht wahr. Wir werden maximal 10 Sekunden lang in einer Schleife ablaufen und alle 500 ms abfragen (dies ist die Standardeinstellung), bis die apply-Methode true zurückgibt.

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

Wenn jemand @Sri als Methode in einem Selenium-Wrapper verwenden möchte, können Sie dies tun (dank dieser Antwort 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

Sie können den xpath verwenden, um das Element mit einem Attribut des gewünschten Werts zu definieren, und dann warten, bis es auf der Seite angezeigt wird. In Python könnte es so aussehen:

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

Dies kann auch mit einer einfachen do-while-Schleife erfolgen: System.currentTimeMillis (); Methode kann verwendet werden, um eine Endlosschleife zu vermeiden

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

Dies funktionierte für mich beim Automatisieren gegen eine ziemlich langsame Bootstrap-Seite, die darauf wartete, dass die Sortierschaltfläche wirksam wurde.

    new WebDriverWait(webDriver, 10)
.until(ExpectedConditions.attributeContains(BUTTON_SORT_ASCENDING_PRICE, "class", "sortButtonActive"));
  • "webDriver" - meine aktuelle Instanz von WebDriver
  • "10" - Zeitüberschreitung Sekunden
  • "BUTTON_SORT_ASCENDING_PRICE" - Der By-Locator für das Element
  • "Klasse" - das Attribut
  • "sortButtonActive" - der Wert von 'class', auf den ich warte

Selen V3.01 

0
Ronald_Bulkins