如何单击存在但使用Splinter不可见的复选框? (硒/ Python)的

时间:2015-05-21 00:44:48

标签: jquery python ajax selenium splinter

来源代码段:

<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()并不能解决问题,而且我没有想法。我可能会遗漏一些非常简单的东西!

3 个答案:

答案 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)

当网络代码被伪造时,这是一个众所周知的问题。按JavaScriptSelenium中@ Mcdizzle解决方案的变体是通过JavaScript发出点击:

browser.execute_script('document.getElementById("%s").click()' % id_string)