45

如何使用 id 或 XPath 表达式检查复选框?是否有类似于通过可见文本选择下拉菜单的方法?

通过为所有其他相关问题给出的示例,我找不到一个合适的解决方案,它以简洁的方式工作,通过几行或几行方法我可以检查一个复选框或单选按钮。

下面是一个示例 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>
4

17 回答 17

67

选择复选框类似于单击按钮。

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

会做。

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

if ( !driver.findElement(By.id("idOfTheElement")).isSelected() )
{
     driver.findElement(By.id("idOfTheElement")).click();
}
于 2013-02-04T09:54:53.393 回答
24

看起来 Internet Explorer 驱动程序与其他驱动程序的交互方式与其他驱动程序的交互方式不同,复选框就是其中一种情况。

复选框的诀窍是发送Space密钥而不是使用单击(仅在 Internet Explorer 上需要),就像在 C# 中一样:

if (driver.Capabilities.BrowserName.Equals(“internet explorer"))
    driver.findElement(By.id("idOfTheElement").SendKeys(Keys.Space);
else
    driver.findElement(By.id("idOfTheElement").Click();
于 2013-11-12T17:40:19.847 回答
6

如果您想一次单击所有复选框,则可以使用以下方法:

private void ClickAllCheckboxes()
{
    foreach (IWebElement e in driver.FindElements(By.xpath("//input[@type='checkbox']")))
    {
        if(!e.Selected)
            e.Click();
    }
}
于 2013-07-02T08:50:00.180 回答
5

C#的解决方案

try
{
    IWebElement TargetElement = driver.FindElement(By.XPath(xPathVal));
    if (!TargetElement.Selected)
    {                    
        TargetElement.SendKeys(Keys.Space);
    }
}
catch (Exception e)
{
}
于 2015-09-28T18:21:55.657 回答
3

您可以使用以下代码:

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/>
于 2013-02-04T13:46:58.477 回答
2

To get the checkbox for 'Seaside & Country Homes', use this XPath:

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

To get the checkbox for 'housingmoves', use this XPath:

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

The principle here is to get the label with the text you want, then get the checkbox that is before the label, since that seems to be how your HTML is laid out.

To get all checkboxes, you would start a little higher up and then work down, so that is to say get the table, and then get any checkbox within a span:

//table/descendant::span/input[@type='checkbox']
于 2013-02-04T10:43:43.980 回答
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();
    }
}
于 2013-07-02T03:59:53.327 回答
1

这应该有帮助 -

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

你也可以传递一个id。

如果您想要诸如可见文本之类的内容,则可以按名称“查找元素”(如果它们有名称)。

于 2013-02-04T09:28:30.923 回答
1

我发现有时 JavaScript 不允许我单击复选框,因为它是按onchange事件处理元素的。

这句话帮助我解决了这个问题:

driver.findElement(By.xpath(".//*[@id='theID']")).sendKeys(Keys.SPACE);
于 2016-12-02T11:45:46.307 回答
1

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

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

for (WebElement ele : allCheckbox) {
    if (ele.isSelected()) {
        ele.click();
    }
}
于 2017-04-15T08:57:17.420 回答
0

要选择一个复选框,请使用"WebElement"该类。

要对下拉列表进行操作,请使用"Select"该类。

于 2013-07-25T06:54:10.520 回答
0

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

if (((RemoteWebDriver)driver).Capabilities.BrowserName == "firefox")
{
    // Firefox
    driver.FindElement(By.Id("idOfTheElement")).Click();
}
else
{
    // Chrome and Internet Explorer
    driver.FindElement(By.Id("idOfTheElement")).SendKeys(Keys.Space);
}
于 2015-02-10T16:20:50.507 回答
0

运行这种方法实际上会切换复选框;.isSelected()在 Java/Selenium 2 中显然总是返回false(至少在我测试过的 Java、Selenium 和 Firefox 版本中)。

选择正确的复选框不是问题所在——而是正确区分初始状态以避免不必要地重新单击已选中的框。

于 2013-02-27T02:26:58.653 回答
0

对于部分匹配,请执行以下操作:

getDriver().findElement(By.cssSelector("<tag name>[id*='id pattern to look for']")).click();
于 2014-12-03T20:09:13.250 回答
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();
于 2014-04-03T10:13:27.070 回答
0

我尝试了各种方法,但没有任何效果。我不断收到“无法单击元素”或 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/)。

于 2016-12-14T17:16:37.583 回答
0

也许是一个很好的起点:

isChecked  = driver.findElement((By.id("idOftheElement"))).getAttribute("name");
if(!isChecked.contains("chkOptions$1"))
{
    driver.FindElement(By.Id("idOfTheElement")).Click();
}
于 2015-09-25T09:42:40.430 回答