J'utilise Java avec WebDriver.Je dois basculer entre deux cadres. J'ai enregistré le scénario de test dans Selenium IDE et j'ai obtenu les valeurs suivantes: selectFrame relative = top select Cadre = milieu Cadre
Mais il y a un problème, il n'est pas capable de reconnaître le relatif = top et middleFrame. Comment puis-je résoudre ce problème dans Selenium WebDriver avec Java?
La méthode driver.switchTo().frame()
de WebDriver utilise l'un des trois arguments possibles:
Sélectionnez une image par son index (base zéro). C'est-à-dire, si une page a trois cadres, la première image serait à index
0
, la seconde à index1
et le troisième à l’index2
. Une fois le cadre sélectionné, tout les appels suivants sur l'interface WebDriver sont effectués sur cette trame.
Sélectionnez un cadre par son nom ou son identifiant. Cadres localisés par nom correspondant les attributs ont toujours la priorité sur ceux appariés par ID.
Un WebElement
trouvé précédemment.
Sélectionnez un cadre à l'aide de son élément WebElement précédemment localisé.
Obtenez le cadre par son identifiant/nom ou localisez-le par driver.findElement()
et tout ira bien.
passer à un cadre:
driver.switchTo.frame("Frame_ID");
pour revenir à la valeur par défaut.
driver.switchTo().defaultContent();
Vous devez d’abord localiser l’identifiant du cadre et le définir dans un WebElement
Par exemple: - WebElement fr = driver.findElementById("id");
Puis passez au cadre en utilisant ce code: - driver.switchTo().frame("Frame_ID");
Un exemple de script: -
WebElement fr = driver.findElementById("theIframe");
driver.switchTo().frame(fr);
Then to move out of frame use:- driver.switchTo().defaultContent();
Vous devez vous assurer qu'une fois basculé dans un cadre, vous devez revenir au contenu par défaut pour accéder aux éléments Web dans un autre cadre. Comme Webdriver ont tendance à trouver le nouveau cadre dans le cadre actuel.
driver.switchTo().defaultContent()
Ce code est groovy, vous devrez donc probablement le retravailler. Le premier paramètre est une URL, le second est un compteur pour limiter les tentatives.
public boolean selectWindow(window, maxTries) {
def handles
int tries = 0
while (true) {
try {
handles = driver.getWindowHandles().toArray()
for (int a = handles.size() - 1; a >= 0 ; a--) { // Backwards is faster with FF since it requires two windows
try {
Log.logger.info("Attempting to select window: " + window)
driver.switchTo().window(handles[a]);
if (driver.getCurrentUrl().equals(window))
return true;
else {
Thread.sleep(2000)
tries++
}
if (tries > maxTries) {
Log.logger.warn("Cannot select page")
return false
}
} catch (Exception ex) {
Thread.sleep(2000)
tries++
}
}
} catch (Exception ex2) {
Thread.sleep(2000)
tries++
}
}
return false;
}
Vous pouvez aussi utiliser:
driver.switch_to.frame(0)
(0)
étant le premier iframe sur le code HTML.
pour revenir au contenu par défaut:
driver.switch_to.default_content()
Il est également possible d’utiliser WebDriverWait avec ExpectedConditions (pour s’assurer que Frame sera disponible).
Avec string comme paramètre
(new WebDriverWait(driver, 5)).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt("frame-name"));
Avec locator comme paramètre
(new WebDriverWait(driver, 5)).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("frame-id")));
Plus d'informations peuvent être trouvées ici