how - ¿Cómo seleccionar casillas de verificación usando Selenium Java webdriver?
xpath selenium java (17)
Aquí el código siguiente primero obtendrá todas las casillas de verificación presentes en la página, y luego deseleccionará todo el recuadro marcado.
List<WebElement> allCheckbox = driver.findElements(By
.xpath("//input[@type=''checkbox'']"));
for (WebElement ele : allCheckbox) {
if (ele.isSelected()) {
ele.click();
}
}
¿Cómo puedo marcar las casillas usando id / xpath? ¿Hay algún método similar a seleccionar por visibletext para desplegable?
Repasando los ejemplos dados para todas las demás preguntas relacionadas, no pude encontrar una solución adecuada que funcione de manera concisa, que por pocas líneas o métodos puedo verificar un chekbox o botón de radio.
Cualquier ayuda sería apreciada.
Una sección HTML de ejemplo está a continuación:
<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>
Aquí está la versión C # de la respuesta de Scott Crowe. Descubrí que tanto IEDriver como ChromeDriver respondieron al envío de Key.Space en lugar de hacer clic en la casilla de verificación.
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);
}
Gracias a Scott por enviarme en la dirección correcta sobre esto.
Descubrí que a veces JavaScript no me permite hacer clic en la casilla de verificación porque estaba trabajando con el elemento mediante el evento onchange
.
Y esa oración me ayuda a permitir el problema:
driver.findElement(By.xpath(".//*[@id=''theID'']")).sendKeys(Keys.SPACE);
Ejecutar este enfoque, de hecho, alternar la casilla de verificación; .isSelected()
en java / Selenium2 aparentemente siempre devuelve false
[al menos con las versiones de java / selenio / Firefox con las que lo probé].
La selección de la casilla de verificación adecuada no es donde radica el problema; más bien, se trata de distinguir correctamente el estado inicial para evitar innecesariamente volver a hacer clic en una casilla ya marcada.
Esto podría ayudar
IWebElement elementToClick = driver.findElement(By.xpath(""//input[contains(@id, ''lstCategory_0'')]"));
elementToClick.Click();
Usted puede pasar la identificación también. Si desea algo como texto visible, puede " buscar elemento " por Nombre si tienen nombres.
Intenté con varios enfoques, pero nada funcionó. Seguí recibiendo "No se puede hacer clic en elemento" o ElementNotVisibleException. Pude encontrar la entrada pero no pude verificarla. Ahora, estoy haciendo clic en el div que contiene la casilla de verificación y funciona con el siguiente HTML (CSS basado en el arranque).
@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>
}
Este es el código para 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();
}
En este enfoque, doy el ID del elemento como id para el div y también agrego un atributo para td con ese id. Una vez que encuentre el td del elemento que debe verificarse, puedo encontrar el div antes de esa td y hacer clic en él. También podemos usar la consulta xpath que admite antes (aquí está el ejemplo http://learn-automation.com/how-to-write-dynamic-xpath-in-selenium/ ).
Me doy cuenta de que esta pregunta ha sido un par de meses, pero la encontré y estaba llegando al mismo problema y encontré una solución. Parece que el controlador IE no interactúa con todo de la misma manera que los otros controladores y las casillas de verificación son uno de esos casos.
El truco con las casillas de verificación es enviar la tecla Espacio en lugar de usar el clic (solo se necesita en IE), como en C #:
if (driver.Capabilities.BrowserName.Equals(“internet explorer"))
driver.findElement(By.id("idOfTheElement").SendKeys(Keys.Space);
else
driver.findElement(By.id("idOfTheElement").Click();
Para emparejamiento parcial Haga lo siguiente
getDriver().findElement(By.cssSelector("<tag name>[id*=''id pattern to look for'']")).click();
Para obtener la casilla de ''Seaside & Country Homes'', use este XPath:
//label[text()=''Seaside & Country Homes'']/preceding-sibling::input[@type=''checkbox'']
Para obtener la casilla de verificación para ''housingmoves'', use este XPath:
//label[text()=''housingmoves'']/preceding-sibling::input[@type=''checkbox'']
El principio aquí es obtener la etiqueta con el texto que desea, luego obtenga la casilla de verificación que está antes de la etiqueta, ya que esa parece ser la forma en que se presenta su HTML.
Para obtener todas las casillas de verificación, comenzarías un poco más arriba y luego trabajarías hacia abajo, es decir obtendrás la tabla, y luego obtendrás cualquier casilla dentro de un lapso:
//table/descendant::span/input[@type=''checkbox'']
Para seleccionar la casilla de verificación, use la clase "WebElement"
. Para operar en la lista desplegable usa la clase "Select"
.
Paso 1: el localizador de objetos que se supone que se usa aquí es XPath. Así que deriva el XPath para esas 2 casillas de verificación.
String housingmoves="//label[contains(text(),''housingmoves'')]/preceding-sibling::input";
String season_country_homes="//label[contains(text(),''Seaside & Country Homes'')]/preceding-sibling::input";
Paso 2:
Realizar Haga clic en las casillas de verificación
driver.findElement(By.xpath(housingmoves)).click();
driver.findElement(By.xpath(season_country_homes)).click();
Puedes usar el siguiente código:
List<WebElement> checkbox = driver.findElements(By.name("vehicle"));
((WebElement) checkbox.get(0)).click();
mi código html fue el siguiente:
<.input type="checkbox" name="vehicle" value="Bike">I have a bike<br />
<.input type="checkbox" name="vehicle" value="Car">I have a car <br />
Seleccionar una casilla de verificación es similar a hacer clic en un botón.
driver.findElement(By.id("idOfTheElement")).click();
va a hacer
Sin embargo, también puede ver si la casilla de verificación ya está marcada. El siguiente fragmento de código comprueba si la casilla de verificación está seleccionada o no. Si no está seleccionado, entonces selecciona.
if ( !driver.findElement(By.id("idOfTheElement")).isSelected() )
{
driver.findElement(By.id("idOfTheElement")).click();
}
Si desea hacer clic en todas las casillas de verificación a la vez, un método como este hará:
private void ClickAllCheckboxes()
{
foreach (IWebElement e in driver.FindElements(By.xpath("//input[@type=''checkbox'']")))
{
if(!e.Selected)
e.Click();
}
}
Solución para C #
try
{
IWebElement TargetElement = driver.FindElement(By.XPath(xPathVal));
if (!TargetElement.Selected)
{
TargetElement.SendKeys(Keys.Space);
}
}
catch (Exception e)
{
}
Tal vez un buen punto de partida:
isChecked = driver.findElement((By.id("idOftheElement"))).getAttribute("name");
if(!isChecked.contains("chkOptions$1"))
{
driver.FindElement(By.Id("idOfTheElement")).Click();
}
Una solución que usa WebDriver y C # está debajo. La idea clave es obtener el ID de la casilla de verificación del atributo "para" de las etiquetas, y usar eso para identificar la casilla de verificación.
El código también establecerá el estado de la casilla de verificación solo si es necesario cambiarla.
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();
}
}