如何检查 Selenium Python 中是不是选中/取消选中复选框? [复制]

Posted

技术标签:

【中文标题】如何检查 Selenium Python 中是不是选中/取消选中复选框? [复制]【英文标题】:How can I check if a checkbox is checked/unchecked in Selenium Python? [duplicate]如何检查 Selenium Python 中是否选中/取消选中复选框? [复制] 【发布时间】:2019-08-23 14:26:09 【问题描述】:

我正在尝试通过返回布尔值的方法检查复选框的状态,但在两种情况下(选中和未选中)都返回 false。

 def checkbox_status(self):
        checked=self.driver.find_element_by_xpath('//span[contains(text(), "Dell")]/parent::span').is_selected()
        return checked

html

<div class="a-checkbox a-checkbox-fancy s-navigation-checkbox">
    <label>
        <input type="checkbox" name="" value="" checked="">
        <i class="a-icon a-icon-checkbox"></i>
        <span class="a-label a-checkbox-label">
            <span class="a-size-base a-color-base a-text-bold">Dell</span>
        </span>
    </label>
</div>

【问题讨论】:

你用find_element_by_namefind_element_by_id试过了吗? @DirtyBit 复选框不包含名称/id/类。所以我用xpath来定位。 确保提供的路径正确。 你能发布html吗? @DirtyBit 使用相同的路径选择复选框,并且可以成功选择它。所以我希望路径是正确的。 【参考方案1】:

问题在于您的 XPath 指向的是 SPAN 而不是 INPUTINPUT 是这里的复选框。如果您将 XPath 切换为指向 INPUT,它应该可以正常工作。

def checkbox_status(self):
    return self.driver.find_element_by_xpath('//input/following::span[.='Dell'][1]').is_selected()

XPath 解释

//input/following::span[.='Dell'][1]
^ find an INPUT
       ^ that is followed by a SPAN
                       ^ that contains the text "Dell"
                                 ^ return only the nearest one

注意:我合并了两行代码,因为这里不需要将元素分配给变量然后返回该变量。只需返回查找结果即可。


回答来自 cmets 的 DebanjanB 关于我正在使用的 XPath 中的[1] 的问题。这是一个简单的演示。我从 HTML 开始

<ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
</ul>

如果我使用 XPath //ul/li,它将返回所有 3 个LIs。如果我将[1] 添加到XPath 以提供//ul/li[1],现在它只返回最接近的LI。这在向上或向下查找 DOM 时很有用。在某些情况下,这不是必需的,因为您可以只使用.find_element()(单数),但我发现在 IE 中这并不总是按预期工作。我还没有完全测试和记录差异,但我认为基本上在某些浏览器中,如果位置不在 XPath 中,它将返回一个集合,其中第一个元素是最接近的元素,但在 IE 中它将返回相同集合,但第一个元素位于 DOM 的顶部,而不是最近的。在艰难地弄清楚这一点之后,我开始只是将 [1] 放在 XPath 中,它似乎可以始终如一地工作(至少在我维护的浏览器上)。

我使用的[1]position() 的别名。你可以阅读更多关于它的信息on MDN。

【讨论】:

您能否阐明By 中的[1] 如何仅返回最近的一个 @DebanjanB 当然。我在问题中添加了一些额外信息以及指向更多参考资料的链接。【参考方案2】:

您可以使用返回布尔值的is_selected 方法

要验证或获取选择状态,我们可以使用两种机制

1.driver.find_element_by_id("privacypolicy").is_selected();

如果选中复选框,则返回“true”,如果未选中,则返回 false。

2.driver.find_element_by_id("privacypolicy").get_attribute("checked");

如果选中该复选框,这将返回“true”。但如果未选中复选框,将返回 NoneType。

更多信息请点击this链接。

【讨论】:

OP 的 HTML 中没有 ID 为“privacypolicy”的元素。他已经在用.is_selected()了,为什么要跟他解释呢?【参考方案3】:

我们可以试试get属性。这对我来说很好:

def status():
    element =driver.find_element_by_xpath('//span[contains(text(), "Dell")]/ancestor::label/input')
    if element.get_attribute('checked') :
        return True
    else:
        return False

【讨论】:

【参考方案4】:

我使用 is_displayed() 而不是 is_selected() 来断言复选框的状态。它工作正常。

def checkbox_status(self):
    checked=self.driver.find_element_by_xpath('//span[contains(text(), "Dell")]/parent::span/parent::label/input[@checked]').is_displayed()
    return checked

【讨论】:

is_displayed 如果元素可见并且与选定状态没有任何关系,则返回 true。请分享带有选中和未选中状态的 HTML

以上是关于如何检查 Selenium Python 中是不是选中/取消选中复选框? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 在 Selenium WD 中检查变量的值是不是为整数? [复制]

使用 Selenium 和 Python,如何检查按钮是不是仍然可点击?

使用 selenium 和 python 检查是不是存在任何警报

使用 Python Selenium 检查元素是不是存在

如何检查显示密码功能在 selenium 中是不是正常工作?

Selenium Webdriver Python - 检查元素是不是可见/检测到/存在[重复]