源代码片段:
<div>
<div class="checkbox checkbox-primary margin-bottom-5 margin-top-5">
<input id="item" name="item" type="checkbox" value="true"/>
<label for="item">Item_Text</label>
<input name="item" type="hidden" value="false"/>
</div>
我正试图使用Splinter点击这个复选框,代码如下:
browser.find_by_id('item')click()
我也试过find_by_name。两者都会产生以下异常:
(<class 'selenium.common.exceptions.ElementNotVisibleException'>, ElementNotVisibleException()
正在尝试调试:
print browser.is_element_present_by_id(item), browser.find_by_id(item).visible
返回True、False
看起来Splinter在点击框时遇到了问题,因为第二个输入块显示type='hidden'。然而,添加.first.click((并不能解决问题,我也没有什么想法。我可能错过了一些非常简单的东西!
以下javascript执行修复了问题:browser.execute_script('document.getElementsByName("%s")[0].checked=true' % item)
在这种情况下,我通常使用xpath
,因为复选框的label
是唯一的,并且更安全,可以正确识别元素。但是,您需要确保id不重复。这是为Selenium
测试提供id的主要部分。试试这个:
//label[contains(text(),'Item_Text')]/../input[@type='checkbox']
使用
browser.find_by_xpath("//label[contains(text(),'Item_Text')]/../input[@type='checkbox']")
上面应该找到基于标签Item_Text的元素
编辑
尝试获取列表,然后查找显示的列表,然后单击
elements = browser.find_by_xpath("//label[contains(text(),'Item_Text')]/../input[@type='checkbox']")
for element in elements:
if element.is_displayed():
element.click()
break
拆分器语法可能有点错误。请根据需要参阅文档。
当JavaScript
"伪造"web代码时,这是一个已知的问题。@Mcdizzle在Selenium
中的解决方案的一个变体是通过JavaScript
:发出点击
browser.execute_script('document.getElementById("%s").click()' % id_string)