Comment puis-je cocher les cases en utilisant id/xpath. Existe-t-il une méthode similaire permettant de sélectionner visibletext pour la liste déroulante?.
En parcourant les exemples donnés pour toutes les autres questions connexes, je ne pouvais pas trouver de solution adéquate qui fonctionne de manière concise et qui permette de vérifier une ligne ou une méthode en vérifiant une case ou un bouton radio.
Toute aide serait appréciée.
Un exemple de section HTML est ci-dessous:
<tbody>
<tr>
<td>
<span class="120927">
<input id="ctl00_CM_ctl01_chkOptions_0" type="checkbox" name="ctl00$CM$ctl01$chkOptions$0"/>
<label for="ctl00_CM_ctl01_chkOptions_0">housingmoves</label>
</span>
</td>
</tr>
<tr>
<td>
<span class="120928">
<input id="ctl00_CM_ctl01_chkOptions_1" type="checkbox" name="ctl00$CM$ctl01$chkOptions$1"/>
<label for="ctl00_CM_ctl01_chkOptions_1">Seaside & Country Homes</label>
</span>
</td>
</tr>
</tbody>
Je me rends compte que cette question a duré pas moins de deux mois mais je l’ai trouvée et je me trouvais face au même problème pour trouver une solution. Il semble que le pilote IE n'interagisse pas avec tout de la même manière que les autres pilotes et que les cases à cocher en font partie.
Le truc avec les cases à cocher est d’envoyer la touche Espace au lieu d’utiliser un clic (besoin uniquement sur IE), comme c’est le cas en C #:
if (driver.Capabilities.BrowserName.Equals(“internet Explorer"))
driver.findElement(By.id("idOfTheElement").SendKeys(Keys.Space);
else
driver.findElement(By.id("idOfTheElement").Click();
Si vous voulez cliquer sur toutes les cases à la fois, une méthode comme celle-ci fera:
private void ClickAllCheckboxes()
{
foreach (IWebElement e in driver.FindElements(By.xpath("//input[@type='checkbox']")))
{
if(!e.Selected)
e.Click();
}
}
Solution pour C #
try
{
IWebElement TargetElement = driver.FindElement(By.XPath(xPathVal));
if (!TargetElement.Selected)
{
TargetElement.SendKeys(Keys.Space);
}
}
catch (Exception e)
{
}
Pour obtenir la case à cocher "Seaside & Country Homes", utilisez cette XPath:
//label[text()='Seaside & Country Homes']/preceding-sibling::input[@type='checkbox']
Pour obtenir la case à cocher pour 'housingmoves', utilisez ce XPath:
//label[text()='housingmoves']/preceding-sibling::input[@type='checkbox']
Le principe ici est d'obtenir l'étiquette avec le texte que vous voulez, puis la case à cocher qui est avant l'étiquette, puisque cela semble être la façon dont votre HTML est mis en forme.
Pour obtenir toutes les cases à cocher, vous commencerez un peu plus haut et ensuite vous réduirez, c'est-à-dire que vous obtiendrez la table, puis une case dans un intervalle:
//table/descendant::span/input[@type='checkbox']
Vous pouvez utiliser le code suivant:
List<WebElement> checkbox = driver.findElements(By.name("vehicle"));
((WebElement) checkbox.get(0)).click();
mon code html était le suivant:
<.input type="checkbox" name="vehicle" value="Bike">I have a bike<br />
<.input type="checkbox" name="vehicle" value="Car">I have a car <br />
Cela pourrait aider -
IWebElement elementToClick = driver.findElement(By.xpath(""//input[contains(@id, 'lstCategory_0')]"));
elementToClick.Click();
Vous pouvez également transmettre id . Si vous voulez quelque chose comme du texte visible, vous pouvez " rechercher élément " par Nom s’ils ont des noms.
Une solution utilisant WebDriver et C # est présentée ci-dessous. L'idée principale est d'obtenir l'ID de la case à cocher à partir de l'attribut labels '' pour 'et de l'utiliser pour identifier la case à cocher.
Le code définira également l'état de la case à cocher uniquement s'il doit être modifié.
public void SetCheckboxStatus(string value, bool toCheck)
{
//get the label containing the checkbox state
IWebElement labelElement = this.Driver.FindElement(By.XPath(string.Format("//label[.='{0}']",value)));
string checkboxId = labelElement.GetAttribute("for");
IWebElement checkbox = this.Driver.FindElement(By.Id(checkboxId));
if (toCheck != checkbox.Selected)
{
checkbox.Click();
}
}
Étape 1: Le localisateur d'objets supposé être utilisé ici est XPath. Alors dérivez le XPath pour ces 2 cases à cocher.
String housingmoves="//label[contains(text(),'housingmoves')]/preceding-sibling::input";
String season_country_homes="//label[contains(text(),'Seaside & Country Homes')]/preceding-sibling::input";
Étape 2:
Effectuer Cliquez sur les cases à cocher
driver.findElement(By.xpath(housingmoves)).click();
driver.findElement(By.xpath(season_country_homes)).click();
J'ai essayé avec une approche différente mais rien n'a fonctionné. Je n'arrêtais pas de "Impossible de cliquer sur l'élément" ou avec ElementNotVisibleException. J'ai pu trouver l'entrée mais je n'ai pas pu la vérifier. Maintenant, je clique sur la div qui contient la case à cocher et cela fonctionne avec le code HTML suivant (CSS basé sur bootstrap).
@foreach (var item in Model)
{
<tr>
<td>
<div id="@item.Id" class="checkbox">
<label><input type="checkbox" class="selectone" value="@item.Id"></label>
</div>
</td>
<td val="@item.Id">
@item.Detail
</td>
<td>
<div>@item.Desc
</div>
</td>
<td>
@Html.ActionLink("Edit", "Create", new { EditId = item.Id })
</td>
</tr>
}
Ceci est le code pour WebDriver
var table = driver.FindElement(By.TagName("table"));
var tds = table.FindElements(By.TagName("td"));
var itemTds = tds.Where(t => t.Text == itemtocheck);
foreach (var td in itemTds)
{
var CheckBoxTd = tds[tds.IndexOf(td) - 1];
var val = td.GetAttribute("val");
CheckBoxTd.FindElement(By.Id(val)).Click();
}
Dans cette approche, je donne l'identifiant d'élément comme id pour le div et ajoute également un attribut pour td avec cet identifiant. Une fois que je trouve le td de l'élément à vérifier, je peux trouver le div avant ce td et cliquer dessus. Nous pouvons également utiliser la requête xpath supportée auparavant (voici l'exemple http://learn-automation.com/how-to-write-dynamic-xpath-in-Selenium/ ).
Peut-être un bon point de départ:
isChecked = driver.findElement((By.id("idOftheElement"))).getAttribute("name");
if(!isChecked.contains("chkOptions$1"))
{
driver.FindElement(By.Id("idOfTheElement")).Click();
}
Pour une correspondance partielle, procédez comme suit:
getDriver().findElement(By.cssSelector("<tag name>[id*='id pattern to look for']")).click();
Voici la version C # de la réponse de Scott Crowe. J'ai constaté qu'IEDriver et ChromeDriver répondaient à l'envoi d'un Key.Space au lieu de cliquer sur la case à cocher.
if (((RemoteWebDriver)driver).Capabilities.BrowserName == "firefox")
{
// Firefox
driver.FindElement(By.Id("idOfTheElement")).Click();
}
else
{
// Chrome and IE
driver.FindElement(By.Id("idOfTheElement")).SendKeys(Keys.Space);
}
Merci à Scott de m'avoir envoyé dans la bonne direction à ce sujet.
Le code ci-dessous commence par obtenir toutes les cases à cocher présentes dans la page, puis désélectionne toutes les cases à cocher.
List<WebElement> allCheckbox = driver.findElements(By
.xpath("//input[@type='checkbox']"));
for (WebElement ele : allCheckbox) {
if (ele.isSelected()) {
ele.click();
}
}
Lancer cette approche va en fait basculer la case à cocher; .isSelected()
en Java/Selenium2 semble toujours renvoyer false
[au moins avec les versions de Java/Selenium/Firefox avec lesquelles je l’ai testé].
Le problème ne réside pas dans la sélection de la case à cocher appropriée, mais bien dans la distinction correcte de l'état initial pour éviter inutilement de cliquer à nouveau sur une case déjà cochée.
J'ai constaté que, parfois, JavaScript ne me permettait pas de cocher la case parce que je travaillais avec l'élément par l'événement onchange
.
Et cette phrase m'aide à accepter le problème:
driver.findElement(By.xpath(".//*[@id='theID']")).sendKeys(Keys.SPACE);
Pour cocher la case, utilisez la classe "WebElement"
. Pour utiliser la liste déroulante, utilisez "Select"
class.