web-dev-qa-db-ger.com

Wie wähle ich Checkboxen mit dem Selenium Java Webdriver aus?

Wie kann ich die Checkboxen mit id/xpath aktivieren? Gibt es eine ähnliche Methode, um per Visibletext Dropdown auszuwählen.

In den Beispielen für alle anderen verwandten Fragen konnte ich keine passende Lösung finden, die auf eine prägnante Weise funktioniert, so dass ich mit wenigen Zeilen oder Methoden eine Checkbox oder einen Optionsschalter überprüfen kann.

Jede Hilfe wäre dankbar. 

Ein Beispiel für einen HTML-Abschnitt finden Sie unten:

<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> 
36
Manish Dwivedi

Das Aktivieren eines Kontrollkästchens ähnelt dem Klicken auf eine Schaltfläche.

driver.findElement(By.id("idOfTheElement")).click();

wird besorgt.

Sie können jedoch auch sehen, ob das Kontrollkästchen bereits aktiviert ist. Das folgende Snippet überprüft, ob das Kontrollkästchen aktiviert ist oder nicht. Wenn es nicht ausgewählt ist, wird ausgewählt.

if ( !driver.findElement(By.id("idOfTheElement")).isSelected() )
{
     driver.findElement(By.id("idOfTheElement")).click();
}
63

Mir ist klar, dass diese Frage schon einige Monate vergangen ist, aber ich habe sie gerade gefunden und dasselbe Problem gefunden und eine Lösung gefunden. Es hat den Anschein, dass der IE - Treiber nicht auf die gleiche Art und Weise mit den anderen Treibern interagiert. 

Der Trick bei Checkboxen ist das Senden der Leertaste anstelle des Klickens (nur bei IE), wie in C #:

if (driver.Capabilities.BrowserName.Equals(“internet Explorer"))
    driver.findElement(By.id("idOfTheElement").SendKeys(Keys.Space);
else
    driver.findElement(By.id("idOfTheElement").Click();
23
Scott Crowe

Wenn Sie alle Kontrollkästchen gleichzeitig anklicken möchten, führt eine Methode wie folgt aus:

private void ClickAllCheckboxes()
{
    foreach (IWebElement e in driver.FindElements(By.xpath("//input[@type='checkbox']")))
    {
        if(!e.Selected)
            e.Click();
    }
}
3
Tedesco

Lösung für C #

try
{
    IWebElement TargetElement = driver.FindElement(By.XPath(xPathVal));
    if (!TargetElement.Selected)
    {                    
        TargetElement.SendKeys(Keys.Space);
    }
}
catch (Exception e)
{
}
3
Arnab

Um das Kontrollkästchen für 'Seaside & Country Homes' zu erhalten, verwenden Sie diesen XPath:

//label[text()='Seaside & Country Homes']/preceding-sibling::input[@type='checkbox']

Verwenden Sie diesen XPath, um die Checkbox für "Housingmoves" zu erhalten:

//label[text()='housingmoves']/preceding-sibling::input[@type='checkbox']

Das Prinzip dabei ist, das Label mit dem gewünschten Text abzurufen und dann das Kontrollkästchen vor das Label zu erhalten, da dies so ist, wie Ihr HTML-Code aufgebaut ist.

Um alle Kontrollkästchen zu erhalten, würden Sie ein wenig höher beginnen und dann nach unten arbeiten, dh die Tabelle abrufen und dann ein beliebiges Kontrollkästchen innerhalb eines Abschnitts erhalten:

//table/descendant::span/input[@type='checkbox']
2
Arran

Sie können den folgenden Code verwenden:

List<WebElement> checkbox = driver.findElements(By.name("vehicle"));
        ((WebElement) checkbox.get(0)).click();

mein HTML-Code war wie folgt:

<.input type="checkbox" name="vehicle" value="Bike">I have a bike<br />
<.input type="checkbox" name="vehicle" value="Car">I have a car <br />
1
Maria

Diese Hilfe soll helfen -

IWebElement elementToClick = driver.findElement(By.xpath(""//input[contains(@id, 'lstCategory_0')]"));
elementToClick.Click();

Sie können id auch ..__ übergeben. Wenn Sie etwas wie sichtbaren Text haben möchten, können Sie " find element " nach Name finden, wenn sie Namen haben.

1
some_other_guy

Eine Lösung, die WebDriver und C # verwendet, ist unten aufgeführt. Die Schlüsselidee besteht darin, die ID des Kontrollkästchens vom Attribut '' für 'der Bezeichnungen abzurufen und dieses Kennzeichen zu identifizieren. 

Der Code setzt den Status des Kontrollkästchens nur dann, wenn es geändert werden muss. 

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();
    }
}
1
Faiz

Schritt 1: Der hier verwendete Objekt-Locator ist XPath. Leiten Sie also den XPath für diese 2 Kontrollkästchen ab.

String housingmoves="//label[contains(text(),'housingmoves')]/preceding-sibling::input";
String season_country_homes="//label[contains(text(),'Seaside & Country Homes')]/preceding-sibling::input";

Schritt 2:

Ausführen Klicken Sie auf die Kontrollkästchen

driver.findElement(By.xpath(housingmoves)).click();
driver.findElement(By.xpath(season_country_homes)).click();
0
user3487861

Ich habe es mit verschiedenen Ansätzen versucht, aber nichts hat funktioniert. Ich bekam immer "Element kann nicht angeklickt werden" oder ElementNotVisibleException. Ich konnte die Eingabe finden, konnte sie jedoch nicht überprüfen. Jetzt klicke ich auf das div, das das Kontrollkästchen enthält, und es funktioniert mit folgendem HTML (CSS basierend auf 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>
            }

Dies ist der Code für 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();
            }

Bei diesem Ansatz gebe ich die Element-ID als ID für das div an und füge auch ein Attribut für td mit dieser ID hinzu. Sobald ich das td des Elements gefunden habe, das überprüft werden muss, kann ich das div vor diesem td finden und auf es klicken. Wir können auch die xpath-Abfrage verwenden, die zuvor unterstützt wird (hier ist das Beispiel http://learn-automation.com/how-to-write-dynamic-xpath-in-Selenium/ ).

0
messed-up

Vielleicht ein guter Ausgangspunkt:

isChecked  = driver.findElement((By.id("idOftheElement"))).getAttribute("name");
if(!isChecked.contains("chkOptions$1"))
{
    driver.FindElement(By.Id("idOfTheElement")).Click();
}
0
Milky

Für teilweise Übereinstimmung Gehen Sie wie folgt vor

getDriver().findElement(By.cssSelector("<tag name>[id*='id pattern to look for']")).click();
0
RCR

Hier ist die C # -Version von Scott Crowes Antwort. Ich habe festgestellt, dass sowohl IEDriver als auch ChromeDriver auf das Senden eines Key.Space reagierten, anstatt auf das Kontrollkästchen zu klicken. 

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

Danke an Scott, der mich in dieser Hinsicht in die richtige Richtung geschickt hat. 

0
dmeehan

Mit dem folgenden Code werden zunächst alle auf der Seite vorhandenen Kontrollkästchen abgerufen, und die Auswahl aller Kontrollkästchen wird aufgehoben. 

List<WebElement> allCheckbox = driver.findElements(By
    .xpath("//input[@type='checkbox']"));

for (WebElement ele : allCheckbox) {
    if (ele.isSelected()) {
        ele.click();
    }
}
0

Wenn Sie diesen Ansatz ausführen, wird das Kontrollkästchen tatsächlich umgeschaltet. .isSelected() in Java/Selenium2 gibt anscheinend immer false [zumindest bei den Java/Selenium/Firefox-Versionen, mit denen ich es getestet habe].

Die Auswahl des richtigen Kontrollkästchens liegt nicht dort, wo das Problem liegt. Vielmehr wird der Ausgangszustand richtig unterschieden, um das erneute Anklicken eines bereits markierten Kästchens unnötig zu vermeiden.

0
Dave

Ich habe festgestellt, dass JavaScript manchmal nicht erlaubt, das Kontrollkästchen zu aktivieren, da es mit dem Element onchange event arbeitet.

Und dieser Satz hilft mir, das Problem zuzulassen:

driver.findElement(By.xpath(".//*[@id='theID']")).sendKeys(Keys.SPACE);
0
ra1x

Um das Kontrollkästchen auszuwählen, verwenden Sie "WebElement" class. Um mit der Dropdown-Liste zu arbeiten, verwenden Sie die "Select"-Klasse.

0
Khan