2013-03-06 14 views
13

Jak mogę używać WebDriverWait czekać aż do zmiany atrybutów?WebDriverWait dla elementu atrybutu zmienić

W moim AUT muszę poczekać, aż przycisk zostanie włączony przed kontynuowaniem, niestety ze względu na sposób, w jaki programista zakodował stronę, nie mogę użyć metody isEnabled() WebElement. Programista używa jakiegoś CSS, aby przycisk wyglądał tak, jakby był wyłączony, więc użytkownik nie może go kliknąć, a metoda isEnabled zawsze zwraca mi wartość true. Muszę więc uzyskać atrybut "wyłączony przez Arię" i sprawdzić, czy tekst jest "prawdziwy" czy "fałsz". Co robiłem do tej pory jest to dla pętli z Thread.Sleep, coś takiego:

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

(pominąć powyższy kod czy nieprawidłowe, tylko pseudo kod, co robię)

Jestem pewien, że jest sposób na osiągnięcie czegoś podobnego za pomocą WebDriverWait, która jest preferowaną metodą, której po prostu nie mogę zrozumieć. To co staram się osiągnąć choć dodaje nie będzie działać:

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

Oczywiście to nie działa, ponieważ funkcja spodziewa się WebElement nie String, ale to, co staram się oceniać. Jakieś pomysły?

Odpowiedz

25

Następujące może pomóc spełnić twoje wymagania. W poniższym kodzie zastępujemy metodę stosującą warunek, którego szukamy. Tak więc, dopóki warunek nie jest prawdziwy, w naszym przypadku aktywacja nie jest prawdą, przechodzimy w pętlę przez maksymalnie 10 sekund, odpytywanie co 500 ms (jest to ustawienie domyślne), dopóki metoda apply nie zwróci wartości 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; 
    } 
}); 
1

Jeśli ktoś chce korzystać @Sri jako metoda w opakowaniu selen, tutaj jest sposób, aby to zrobić (dzięki 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)); 
} 
0

ten pracował dla mnie podczas automatyzowania przeciwko dość powolna strona ładowania początkowego, oczekująca na naciśnięcie przycisku sortowania.

new WebDriverWait(webDriver, 10) 
.until(ExpectedConditions.attributeContains(BUTTON_SORT_ASCENDING_PRICE, "class", "sortButtonActive")); 
  • "webDriver" - moja obecna instancja WebDriver
  • "10" - timeout sekund
  • "BUTTON_SORT_ASCENDING_PRICE" - The Przez lokalizator dla elementu
  • "klasa" - atrybut
  • "sortButtonActive" - wartość 'klasy' czekam

Selen v3.01

0

To może być również wykonane za pomocą prostego do-while, System.currentTimeMillis(); Metoda może być użyta do uniknięcia nieskończonej pętli

long startTime = System.currentTimeMillis(); 
String disabled; 
do{ 
    disabled = element.getAttribute("attributeName").trim(); 
}while(disabled!="false" && System.currentTimeMillis()-startTime<10000); 
Powiązane problemy