如何检查 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
<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_name
或find_element_by_id
试过了吗?
@DirtyBit 复选框不包含名称/id/类。所以我用xpath来定位。
确保提供的路径正确。
你能发布html吗?
@DirtyBit 使用相同的路径选择复选框,并且可以成功选择它。所以我希望路径是正确的。
【参考方案1】:
问题在于您的 XPath 指向的是 SPAN
而不是 INPUT
。 INPUT
是这里的复选框。如果您将 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 个LI
s。如果我将[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 检查是不是存在任何警报