如何使用selenium java webdriver选择复选框?

时间:2013-02-04 08:16:55

标签: selenium webdriver selenium-webdriver xpath

如何使用id / xpath检查复选框。有没有类似于selecttext by selecttext的方法。

通过给出所有其他相关问题的示例,我找不到一个简洁的方法,通过几行或方法我可以检查chekbox或单选按钮。

任何帮助将不胜感激。

示例HTML部分如下:

<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> 

17 个答案:

答案 0 :(得分:61)

选中复选框与单击按钮类似。

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

会做的。

但是,您还可以查看是否已选中该复选框。以下代码段检查是否选中了复选框。如果未选中,则选择。

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

答案 1 :(得分:23)

我意识到这个问题已经持续了几个月,但我刚刚找到它并且遇到了同样的问题,并找到了解决方案。似乎IE驱动程序不会像其他驱动程序那样与所有内容交互,而复选框就是其中一种情况。

复选框的技巧是发送Space键而不是使用click(只需要在IE上),就像在C#中一样:

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

答案 2 :(得分:3)

如果您想立即点击所有复选框,可以执行以下方法:

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

答案 3 :(得分:3)

C#的解决方案

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

答案 4 :(得分:2)

获取'Seaside&amp; amp;的复选框Country Homes',使用此XPath:

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

要获取“housingmoves”的复选框,请使用此XPath:

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

这里的原则是使用您想要的文本获取标签,然后获取之前标签的复选框,因为这似乎是HTML布局的方式。

要获取所有复选框,您可以稍微高一点然后继续工作,这就是说获取表格,然后获取范围内的任何复选框:

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

答案 5 :(得分:1)

您可以使用以下代码:

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

我的HTML代码如下:

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

答案 6 :(得分:1)

使用WebDriver和C#的解决方案如下。关键的想法是从标签''for'属性中获取复选框的ID,并使用它来标识复选框。

只有在需要更改时,代码才会设置复选框状态。

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

答案 7 :(得分:1)

这可以帮助 -

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

你也可以传递id。 如果您需要类似可见文本的内容,则可以按名称“查找元素”(如果它们有名称)。

答案 8 :(得分:0)

运行此方法实际上会切换复选框; java / Selenium2中的.isSelected()显然总是返回false [至少使用我测试过的java / selenium / Firefox版本]。

选择正确的复选框不是问题所在 - 而是正确区分初始状态,不必要地重新点击已经选中的复选框。

答案 9 :(得分:0)

要选中复选框,请使用"WebElement"课程。要在下拉列表中操作,请使用"Select"类。

答案 10 :(得分:0)

第1步: 应该在这里使用的对象定位器是XPath。因此,为这两个复选框导出XPath。

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

第2步:

执行单击复选框

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

答案 11 :(得分:0)

部分匹配请执行以下操作

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

答案 12 :(得分:0)

这是Scott Crowe的答案的C#版本。我发现IEDriver和ChromeDriver都回复了发送Key.Space而不是单击复选框。

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

感谢斯科特给我的正确方向。

答案 13 :(得分:0)

也许是一个很好的起点:

String date = "Fri Sep 25 10:38:42 IST 2015";
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss ZZZ yyyy", Locale.ENGLISH); 
SimpleDateFormat newsdf =new SimpleDateFormat("YYYY-MM-dd");

答案 14 :(得分:0)

我发现有时JavaScript不允许我点击该复选框,因为onchange事件正在使用该元素。

这句话有助于我解决问题:

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

答案 15 :(得分:0)

我尝试了各种方法,但没有任何效果。我一直在&#34;无法点击元素&#34;或ElementNotVisibleException。我能够找到输入但无法检查。现在,我点击包含复选框的div,它可以使用以下HTML(基于bootstrap的CSS)。

 @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>
            }

这是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();
            }

在这种方法中,我将项目ID作为div的id,并为该id添加td的属性。一旦我找到需要检查的项目的td,我就可以在该td之前找到div并单击它。我们也可以使用之前支持的xpath查询(这里是示例http://learn-automation.com/how-to-write-dynamic-xpath-in-selenium/)。

答案 16 :(得分:0)

下面的代码将首先获取页面中的所有复选框,然后取消选中所有选中的复选框。

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

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