来源代码段:
<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 =&#39; hidden&#39;。但是,添加.first.click()并不能解决问题,而且我没有想法。我可能会遗漏一些非常简单的东西!
答案 0 :(得分:2)
以下javascript执行修复了问题:browser.execute_script('document.getElementsByName("%s")[0].checked=true' % item)
答案 1 :(得分:0)
我通常在这种情况下使用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
Splinter语法可能有点偏差。请根据需要参考set datefirst N
。
答案 2 :(得分:0)
当网络代码被伪造时,这是一个众所周知的问题。按JavaScript
。 Selenium
中@ Mcdizzle解决方案的变体是通过JavaScript
发出点击:
browser.execute_script('document.getElementById("%s").click()' % id_string)