3

源代码片段:

<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

返回真,假

由于第二个输入块显示 type='hidden',因此 Splinter 似乎无法单击该框。但是,添加 .first.click() 并不能解决问题,而且我没有想法。我可能错过了一些非常简单的东西!

4

3 回答 3

2

以下 javascript 执行解决了该问题:browser.execute_script('document.getElementsByName("%s")[0].checked=true' % item)

于 2015-05-21T09:33:50.243 回答
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

分裂语法可能有点偏离。请根据需要参考文档

于 2015-05-21T01:39:11.250 回答
0

当 Web 代码被JavaScript. @Mcdizzle 解决方案的一种变体Selenium是通过以下方式发出点击JavaScript

browser.execute_script('document.getElementById("%s").click()' % id_string)
于 2017-01-13T23:26:30.257 回答