Comment utiliser WebDriverWait pour attendre qu'un attribut change?
Dans mon AUT, je dois attendre que le bouton soit activé avant de continuer, malheureusement, en raison de la façon dont le développeur a codé la page, je ne peux pas utiliser la méthode isEnabled () de WebElement. Le développeur utilise du code CSS pour que le bouton donne l'impression qu'il est désactivé afin que l'utilisateur ne puisse pas cliquer dessus et que la méthode isEnabled renvoie toujours la valeur true pour moi. Donc, ce que je dois faire est d'obtenir l'attribut "aria-disabled" et vérifier si le texte est "true" ou "false". Ce que j'ai fait jusqu'à présent, c'est une boucle for avec Thread.sleep, quelque chose comme ceci:
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);
}
(ignorez le code ci-dessus s'il est incorrect, pseudo-code de ce que je fais)
Je suis sûr qu'il existe un moyen d'obtenir quelque chose de similaire en utilisant WebDriverWait, qui est la méthode préférée. Je ne peux tout simplement pas comprendre comment. C’est ce que j’essaie de réaliser, même si ce qui suit ne fonctionnera pas:
WebDriverWait wait = new WebDriverWait(driver, 60);
wait.until(ExpectedConditions.visibilityOf(refresh.getText() == "true"));
Évidemment, cela ne fonctionne pas car la fonction attend un WebElement, pas String, mais c'est ce que j'essaie d'évaluer. Des idées?
Les éléments suivants peuvent aider votre exigence . Dans le code suivant, nous substituons la méthode apply incorporant la condition que nous recherchons. Ainsi, tant que la condition n'est pas vraie, dans notre cas, la valeur enabled n'est pas vraie. Nous allons en boucle pendant 10 secondes au maximum, en effectuant une scrutation toutes les 500 ms (valeur par défaut) jusqu'à ce que la méthode apply renvoie 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;
}
});
Si quelqu'un veut utiliser @Sri comme méthode dans un wrapper Selenium, voici une façon de le faire (grâce à cette réponse 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));
}
Vous pouvez utiliser xpath pour définir l'élément avec un attribut de la valeur souhaitée, puis attendre qu'il se produise sur la page . En Python, cela pourrait ressembler à ceci:
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)))
Cela peut également être fait en utilisant une simple boucle do-while, System.currentTimeMillis (); méthode peut être utilisée pour éviter une boucle infinie
long startTime = System.currentTimeMillis();
String disabled;
do{
disabled = element.getAttribute("attributeName").trim();
}while(disabled!="false" && System.currentTimeMillis()-startTime<10000);
Cela a fonctionné pour moi lors de l'automatisation sur une page de démarrage assez lente, attendant que le bouton de tri prenne effet.
new WebDriverWait(webDriver, 10)
.until(ExpectedConditions.attributeContains(BUTTON_SORT_ASCENDING_PRICE, "class", "sortButtonActive"));
Sélénium V3.01